且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-13 22:58:29

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
 
谢谢你了
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!