C ++ NOT按位运算符二进制字符转换

时间:2013-10-25 09:00:13

标签: c++ bit-manipulation

我正在从Primer第5版学习C ++。其中一个问题是:

  

~'q'<<的数值是多少? 6在具有32位整数和8位字符的机器上,使用拉丁-1字符集,其中'q'的位模式为01110001?

我感到困惑的是编译器会在〜之前或之前将'q'转换为32位int。

据我所知,它应该是这样的:

'q' = 01110001

~'q' = 10001110

~'q' << 6 = 00000000000000000010001110000000

我是对的吗?

2 个答案:

答案 0 :(得分:7)

运算符~对其操作数执行整数提升(C ++ 11,[expr.unary.op]§10)。这意味着它会在执行补充之前将char转换为int。所以它会是这样的:

'q' == 01110001

~ 'q' == ~ 00000000000000000000000001110001

~ 'q' == 11111111111111111111111110001110

然后出现问题。我们看到~ 'q'的值是负数。左移负值具有未定义的行为([expr.shift]§2)。 (感谢@colombien's answer指出最后一部分)

答案 1 :(得分:2)

我想答案就在这里:Bitwise operators and signed types

  

表达式~'q' << 6导致未定义的行为。

相关问题