C语言的左位移能不能超过8位?

C语言的左位移能不能超过8位?比如b=a<<20; 这样可以不?如果可以,一个字节只有8个位,左移20位是不是连右边其它字节的12个位(20-8)也一起左移?
字符变量左移八次后,所有的位都移出去了,继续左移当然可以,但没有意义,因为左移八次后八个位都是0,再移没有意义

追答:

他左边的字节不受影响

追问:

int变量a(32个二进制位)左移25位的话,它是32个二进制位一起左移还是每8个二进制位单独左移25位?
比如a<<=25  它是以全部32个位为整体一起左移25位吗?也就是32位移出去25位?
还是这32位分成四个字节,然后以字节为单位,每个字节分别左移25位?

追答:

移位是针对所有二进制位的,不是一个字节。a<<=25 每移动一次,32个位都跟着一起向左移一位。

追问:

你说的char变量左移8位后就全都移出去了,再移就没有意义了因为八个位都是0
但我试过了好像不是这样
比如char ch=1; printf("%d",ch<<8);结果却输出256
printf("%d",ch<<25);结果就输出33554432
按道理char变量ch左移7位应该就是-128,再移下去就全变成0了,但实际结果却是移七位的时候还没有变成-128,而是128,再移下去不但没有变成0,反而输出结果更大。。 不知道为什么会这样

追答:

其实你问的是另一个问题了
你以%d格式输出就不是原来的类型了

追问:

已经定义了char ch,就相当于定义给他分配一个字节,至于%d和%c只是把存在内存中的那串二进制以不同形式输出而已,
一个char ch最大数就是01111111
按道理左移八位就全部都移出去了,但实际结果不是这样

追答:

你写成ch<<8或ch<<25,输出的是表达式的值,而不是变量的值,在<<后面加上=看看,结果是不同的,这时输出的是变量的值

追问:

哦,明白了,ch<<25并不是赋值给ch
谢谢你了

收起

提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
时间: 2024-09-29 23:45:29

C语言的左位移能不能超过8位?的相关文章

Python:给定一个不超过5位的正整数,判断有几位

方法一:作比较 [root@python markPy]# cat five.py #!/usr/bin/python3 a=int(input(">>>>")) if a<10: print(1) elif a<100: #第一个条件已经过滤了大于9,所以这里区间是11到100 print(2) elif a<1000: print(3) elif a<10000: print(4) else: print(5) 方法二:使用整除实现,

5、输入一个不超过5位的正整数,编程实现:求出它是几位数,分别输出每位数字。

1 #include<stdio.h> 2 #include<math.h> 3 int flws(int); 4 void main() 5 { 6 int n,j,k=0; 7 printf("请输入一个正整数:\n"); 8 scanf("%d",&n); 9 j=n; 10 while(j!=0) //取位 11 { 12 j/=10; 13 k++; 14 } 15 if(k<=5) 16 flws(n,k); 17

C语言浮点数除法可以精确到多少位小数

double型的两个数相除,得到的浮点数能精确到多少位呢..用我家电脑做了个实验,编译器是Code::Blocks 13.12. 然后用电脑自带的计算器算的结果和C语言算的结果比较如图. 第一例里a=199000007,b=3030337,得到的答案在小数点后第14位(我没数错吧)开始不同了. 第二个例子里a=202033320333,b=1234567,在小数点后第11位开始不同了. 所以浮点数除法精确的位数是不固定的.

C语言高级程序设计——进制算法以及位算符号

语言不够官方:意会: 数据储存运算是以二进制的,二进制数有原码 反码 补码三种.通常所说的二进制就是原码.(语言不官方) 原码 :4的原码可以为:0000 0100:最高位0 可以为符号数 反码:正数和原码相同,负数的符号位不变,其余位0变1,1变0 补码:正数和原码相同,负数的补码在反码的基础上加1(二进制存储是以补码来存的) 二进制八进制互转 二转八:三位转一位:八转二:一位转三位: 二进制十进制互转 二转十:按照8 4 2 1乘以各个位置数字:十转二:整数部分累除2取余数法,小数部分乘2取

python默认的是17位小数的精度,但是这里有一个问题,就是当我们的计算需要使用更高的精度(超过17位小数)的时候该怎么做呢?

1. 使用格式化(不推荐) 1 2 3 >>> a = "%.30f" % (1/3) >>> a '0.333333333333333314829616256247' 可以显示,但是不准确,后面的数字往往没有意义. 2. 高精度使用decimal模块,配合getcontext 1 2 3 4 5 6 7 8 9 10 11 12 >>> from decimal import * >>> print(getcon

c语言:2种方法:5位运动员参加跳水比赛,每位选手都说对一半,请确定比赛名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第一,我第三. B选手说:我第二,E第四. C选手说:我第一,D第二. D选手说:C最后,我第三. E选手说:我第四,A第一. 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次. 程序一: #include<stdio.h> int main() { int a = 1, b = 1,c = 1,d=1,e=1; for (a = 1; a <= 5; a++) { for (b = 1; b <= 5; 

C语言实现之比较两数有多少位不同

问题描述:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子:1999 2299输出例子:7 代码实现: #include <stdio.h> int main() {  int m=1999;//011111001111  int n=2299;//100011111011  int c=m^n; //111100110100  int count=0;  while (c)  {   if(c%2==1)   {    count++;   }   else

C语言字节对齐问题(以32位系统为例)

1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐. 2. 计算机为什么要对齐? 各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取,其他平台可能没有这种情况.但是最常见的是,如果不按照适合其平台的要求对数据存放进行对齐,会在存取

全国计算机等级考试二级教程-C语言程序设计_第15章_位运算

原码 也叫 符号-绝对值码 最高位0表示正,1表示负,其余二进制位是该数字的绝对值的二进制位. 原码简单易懂 加减乘除复杂,存在加减乘除四种运算,增加了CPU的复杂度 零的表示不唯一 没有在计算机中应用 反码 反码运算不便,也没有在计算机中应用. 移码 移码表示数值平移n位,n称为移码量 移码主要用于浮点数的阶码的存储 补码 已知十进制求二进制 求正整数的二进制 除2取余,直至商为零,余数倒叙排序. 求负整数的二进制 先求与该负数相对应的正整数的二进制,然后将所有位取反,末尾加1,不够位数时,左