2

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

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

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

据我了解,它应该像这样工作:

'q' = 01110001

~'q' = 10001110

~'q' << 6 = 00000000000000000010001110000000

我对吗?

4

2 回答 2

7

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

'q' == 01110001

~ 'q' == ~ 00000000000000000000000001110001

~ 'q' == 11111111111111111111111110001110

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

于 2013-10-25T09:06:50.990 回答
2

我想答案就在这里:按位运算符和有符号类型

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

于 2017-02-17T14:13:20.217 回答