我是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);
答案 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。