c++ - 按位运算期间整数提升的行为
问题描述
当对小于的算术类型执行按位运算时int
,它会自动提升为int
.
std::uint8_t a = 42;
auto b = a | 0x0f;
// b will be of type int
我无法确定这次促销期间到底发生了什么,特别是因为它正在从无符号整数转换为有符号整数。的数值会a
保持一致,可能会改变二进制表示吗?或者二进制表示是否会保持一致,可能会导致不同的数值?
是否有理由将价值提升到int
而不是unsigned int
?后者不会引起任何这种混乱。
解决方案
整数在提升后具有相同的值。提升的类型首先必须能够存储源类型的所有值(可能更多)才能做到这一点。特别是,这意味着一个无符号值在提升后永远不会变成负数,如果 anint
太小,提升的类型可能是unsigned int
。但请注意,它总是std::uint8_t
会提升为int
,因为它总是足够大。
当整数提升发生在有符号整数上时,负值的“二进制表示”将被符号扩展(更多 1)。例如,用std::int8_t a = -1;
, a & 0b100000000 != 0
, 即使二进制表示只是0b11111111
. 但这不会发生在无符号值或有符号正值上。
对象表示(当您 memcpy 到 char 数组时)可能会在提升后发生变化。这在有符号的情况下很容易看到,但在无符号的情况下,由于字节顺序,字节的顺序可能不同。
推荐阅读
- javascript - Vuejs2窗口获得滚动高度
- php - PHP Xdebug 不在 php 中
- python - 使用 WTForms Flask 解析日期 - Python
- javascript - Ember 为什么我们必须对某些 bower 依赖项使用 import
- javascript - 将 JSON 信息存储在 HTML 文件中或以其他方式存储
- python - Python - 用于 GIS 和生成多边形的几何基元
- webpack - Webpack 动态导入中的字符串文字
- android - Parcelable 示例错误。
- swift - SKTextureAtlas 留在记忆中
- c - Issue with scanf and pointers