按位运算中的字符转换
char conversion in bitwise operations
我正在实现一个打印位掩码的函数。我想一次按字节执行此操作。我遇到了一个我无法理解的奇怪的类型转换问题。
以下代码片段打印 256
char i = 128;
int j = 256;
printf("%u", (i & j));
而将 i 更改为 int returns 0:
int i = 128;
int j = 256;
printf("%d", (i & j));
是什么导致了第一个的奇怪行为?
char i=128
是一个 符号 值,当你 &
它与 j
.
char
似乎已在您的系统上签名。这就是为什么当您执行 (i & j)
时 128 在转换为 int
时得到 sign-extended
因此128变成了0xFFFFFF80
,所以&
对0x00000100
进行了0xFFFFFF80
:
00000000000000000000000100000000 // 256
11111111111111111111111110000000 // 128, sign-extended
当您对 int
执行相同的操作时,没有执行符号扩展,因此您得到了预期的零。
要避免此行为,请指定 i
应该是 unsigned char
:
unsigned char i = 128;
int j = 256;
printf("%u", (i & j));
这会产生零 (demo)。
我正在实现一个打印位掩码的函数。我想一次按字节执行此操作。我遇到了一个我无法理解的奇怪的类型转换问题。
以下代码片段打印 256
char i = 128;
int j = 256;
printf("%u", (i & j));
而将 i 更改为 int returns 0:
int i = 128;
int j = 256;
printf("%d", (i & j));
是什么导致了第一个的奇怪行为?
char i=128
是一个 符号 值,当你 &
它与 j
.
char
似乎已在您的系统上签名。这就是为什么当您执行 (i & j)
int
时得到 sign-extended
因此128变成了0xFFFFFF80
,所以&
对0x00000100
进行了0xFFFFFF80
:
00000000000000000000000100000000 // 256
11111111111111111111111110000000 // 128, sign-extended
当您对 int
执行相同的操作时,没有执行符号扩展,因此您得到了预期的零。
要避免此行为,请指定 i
应该是 unsigned char
:
unsigned char i = 128;
int j = 256;
printf("%u", (i & j));
这会产生零 (demo)。