我是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)赋值它时,会发生整数溢出,导致未定义行为。