我正在从Primer第5版学习C ++。其中一个问题是:
~'q'<<的数值是多少? 6在具有32位整数和8位字符的机器上,使用拉丁-1字符集,其中'q'的位模式为01110001?
我感到困惑的是编译器会在〜之前或之前将'q'转换为32位int。
据我所知,它应该是这样的:
'q' = 01110001
~'q' = 10001110
~'q' << 6 = 00000000000000000010001110000000
我是对的吗?
答案 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
导致未定义的行为。