我正在尝试在C中进行位运算。这是我的代码:
int main() {
char c = 127;
c <<= 1;
if (c == 0xfe) {
printf("yes");
}
else {
printf("No");
}
return 0;
}
系统控制台输出编号。 我期望收到的是肯定的回答。 位移后c中的值为ffffffffe。 看起来系统已经将8位转换为32位。有人能帮忙吗。
我正在尝试在C中进行位运算。这是我的代码:
int main() {
char c = 127;
c <<= 1;
if (c == 0xfe) {
printf("yes");
}
else {
printf("No");
}
return 0;
}
系统控制台输出编号。 我期望收到的是肯定的回答。 位移后c中的值为ffffffffe。 看起来系统已经将8位转换为32位。有人能帮忙吗。
0xfe
。但实际上这里发生了更多的事情:当你写入数据时,数据被视为无符号整数,因此十六进制值0xfe
实际上被解释为 254 而不是 -2。这意味着如果你从内存中读取这个字节并将其转换为有符号整数,你将得到一个错误的结果。if (c == 0xfe) {
...
}
0xfffffffe
,这就是后续比较失败的原因。0xfe
强制转换为char类型,像这样:if (c == (char)0xfe) {
...
}
相比之下,无符号字符在使用int
提升时不会给你带来麻烦,因为它们可以很好地适应int
的范围:
unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
...
}
注意:由于 char
溢出,c <<= 1
的行为是实现定义的。
c <<= 1;
中的行为是由于溢出而实现定义的。 - Eric Postpischilc
中的值仍然是 0xfe
,但通过调用 printf()
函数进行了提升。· - Akrios0xfffffffe
只有 32 位(每个 4 位组成的 8 个半字节)。它不是升级到 int
的操作,而是其他操作:打印、比较等。C 这样做很多,所以在使用带符号字符时需要小心。另一方面,无符号字符则不会给您带来任何麻烦。请参见编辑。 - Sergey Kalinichenko