zhumengyun 发表于 2014-11-12 09:32:26

位运算

#include<stdio.h>
main()
{
        char a=0x95,b,c;
        b=(a & 0x0f)<<4;
        c=(a & 0xf0)>>4;
        a=b | c;
        printf("a=%d",a);
}(vc6.0)
为什么结果是89

蓝色标记0x95的十进制是149,超过了char的范围127,怎么办啊,
红色标记有符号位右移,应该是补符号位的吧


仰望天上的光 发表于 2014-11-12 20:06:50

位操作的时候,你可以把char看成unsigned char类型,因为在位级别上,有符号数和无符号数的运算是一样的。

zhumengyun 发表于 2014-11-13 09:58:36

有符号和无符号在位级别运算怎么可能会一样啊,例如向右移位的时候有符号就补符号位的

tlwangxd 发表于 2014-11-13 15:19:33

??

风之残月 发表于 2014-11-17 11:27:25

对于位移是不存在超出范围的,只是解释它的时候可能会有溢出的逻辑错误
C语言标准左移是低位补0,但是对于右移并没有明确定义应该使用哪种类型(算术或逻辑)的右移。 右移位运算时对于无符号数来运算总是高位补0,而有符号数有可能补充的是符号位.也有可能补充的是0.是没有规定的,编译器处理可能不同

zhumengyun 发表于 2014-11-17 16:22:47

感谢上面的回答,谢谢。可不可以在讲的细致一点(只是解释它的时候可能会有溢出的逻辑错误)是什么意思
页: [1]
查看完整版本: 位运算