【发布时间】:2017-01-23 23:53:26
【问题描述】:
有人能解释一下为什么当我对两个数字进行按位或运算时会得到这个结果吗?我真的很困惑。
signed char signedChar = -64; // This is now -64, or 1100 0000
unsigned char unsignedChar = signedChar; // This is now 196, or 1100 0000 (The same)
short signedShort = 0; // This is now 0000 0000 0000 0000
signedShort |= signedChar; // This is now -64, not 196
我预期会发生的是,我对 signedShort 和 signedChar 进行了运算,即:
0000 0000 0000 0000 or'ed with
1100 0000
0000 0000 1100 0000 result
equalling 196.
但我得到了 -64
为什么这个 OR 操作会在开头添加一个?我完全期待一些不同的东西。
谢谢。
【问题讨论】:
-
算术转换?
-
因为符号扩展。
-
@Kerrek 哦,所以你是说在它执行操作之前,它会将 char 提升为 short,然后 short 有一个前导 1,然后按位 OR?有什么方法可以将这些位添加到短片中?
-
比这更微妙。事实上,一切都被提升为
int。通常你应该 a) 使用无符号类型,然后 b) 截断结果。 -
与零进行或运算不会改变其值。所以如果你用 -64 或 0,你得到 -64。这与
signedShort = signedChar;没有什么不同。
标签: c++ c bit-manipulation bits