C和char的位移位

  • 本文关键字:char bit-manipulation
  • 更新时间 :
  • 英文 :


我是C的新手,很难理解为什么下面的代码打印出ffffffff,而二进制1111111应该等于十六进制ff

int i;
char num[8] = "11111111";
unsigned char result = 0;
for ( i = 0; i < 8; ++i )
    result |= (num[i] == '1') << (7 - i);
}
printf("%X", bytedata);

打印可能未初始化的bytedata

代替

printf("%X", bytedata);

 printf("%X", result);

你的代码运行得很好。代码

虽然在C中是合法的,但为了良好的实践,您应该使用

char num[8] = "11111111";  

char num[9] = "11111111";

因为在C语言中,空字符('')总是附加在字符串字面值后面。而且它也不能用g++编译成c++文件。

编辑

回答你的问题

如果我使用char,结果是FFFFFFFF,但如果我使用unsigned char,结果是FF。

答:

案例1:在C语言中,char的大小是1byte(大多数实现)。如果它是无符号的,我们可以使用8位,最大11111111为二进制,最大FF为十六进制(十进制255)。当你用printf("%X", result);打印它时,这个值隐式地转换为unsigned int,变成十六进制的FF

Case 2:但是当您使用char(signed)时,则MSB位用作符号位,因此您最多可以使用7位用于十进制范围为-128到127的数字。当你用FF(十进制255)赋值它时,会发生整数溢出,导致未定义行为。

最新更新