c和char中的位移位

时间:2015-10-06 21:54:03

标签: c 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);

1 个答案:

答案 0 :(得分:4)

您打印的bytedata可能是未初始化的。

替换

printf("%X", bytedata);

 printf("%X", result);

然后你的代码运行正常。 code

虽然它在C中是合法的,但是对于良好的练习,你应该

char num[8] = "11111111";  

char num[9] = "11111111";

因为在C中,空字符('\ 0')始终附加到字符串文字。而且它也不会用g ++编译为C ++文件。

编辑

回答你的问题

  

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

答案:

案例1: 在C的C大小是1byte(大多数实现)。如果它是未签名的,我们可以 使用8位并保持二进制最大11111111和十六进制FF(十进制255)。当您使用printf("%X", result);打印时,此值会隐式转换为unsigned int,并以十六进制形式变为FF

案例2:但是当你使用char(有符号)时,MSB位用作符号位,因此你可以使用最多7位的数字,其范围是-128到127(十进制)。当您使用FF(十进制255)分配时,会出现Integer Overflow,这会导致Undefined behavior