相关疑难解决方法(0)

按位运算符和签名类型

我正在阅读C++ Primer,我对一些关于Bitwise运算符如何处理有符号类型的注释感到有些困惑.我会引用:

引用#1

(当谈到按位运算符时)"如果操作数是有符号的并且其值是负的,那么在许多按位运算中处理"符号位"的方式取决于机器.此外,执行左移位会改变符号位的值未定义"

引用#2

(当谈到右移操作符时)"如果该操作数是无符号的,则操作符在左侧插入0值位;如果是有符号类型,则结果是实现定义 - 符号位的副本或0值位插在左边."

按位运算符将小整数(例如char)提升为已签名的整数.当按位运算符经常在已签名的运算符类型上给出未定义或实现定义的行为时,此促销对于签名整数是否存在问题?为什么标准不会将char提升为unsigned int?


编辑:这是我提出的问题,但我已将其放回上下文,并在下面给出了一些答案.

之后的一个练习问道

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

好吧,'q'是一个字符文字,将被提升为int,给予

~'q' == ~0000000 00000000 00000000 01110001 == 11111111 11111111 11111111 10001110

下一步骤是将左移位运算适用于上面的位,但作为报价#1提到

"做一个改变符号位值的左移是未定义的"

好吧,我不知道哪个位是符号位,但肯定答案是未定义的?

c++ signed bit-manipulation language-lawyer

6
推荐指数
2
解决办法
2528
查看次数

标签 统计

bit-manipulation ×1

c++ ×1

language-lawyer ×1

signed ×1