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

Deo*_*oeh 2 c++ bit-manipulation

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

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

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

据我所知,它应该这样工作:

'q' = 01110001

~'q' = 10001110

~'q' << 6 = 00000000000000000010001110000000
Run Code Online (Sandbox Code Playgroud)

我对吗?

Rei*_*ica 7

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

'q' == 01110001

~ 'q' == ~ 00000000000000000000000001110001

~ 'q' == 11111111111111111111111110001110
Run Code Online (Sandbox Code Playgroud)

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