首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位运算期间整数提升的行为

位运算期间整数提升的行为
EN

Stack Overflow用户
提问于 2020-09-01 08:11:45
回答 1查看 150关注 0票数 7

当一个人在小于int的算术类型上执行位操作时,它会自动提升为int

代码语言:javascript
复制
std::uint8_t a = 42;
auto b = a | 0x0f;
// b will be of type int

我还不能确定的是,在这个提升过程中到底发生了什么,特别是因为它正在从无符号整数转换为有符号整数。a的数值是否会保持一致,从而潜在地改变二进制表示法?或者,二进制表示是否保持一致,从而可能导致不同的数值?

是否存在将该值提升为int而不是unsigned int的原因?后者不会引起任何这种混乱。

EN

回答 1

Stack Overflow用户

发布于 2020-09-01 08:43:34

升级后的整数具有相同的值。提升的类型首先必须能够存储源类型的所有值(可能更多)才能做到这一点。特别是,这意味着无符号值在提升后永远不会变为负值,如果int太小,则提升的类型可能为unsigned int。但请注意,std::uint8_t将始终提升到int,因为它将始终足够大。

当有符号整数发生整数提升时,负值的“二进制表示”将被符号扩展(更多的1)。例如利用std::int8_t a = -1;a & 0b100000000 != 0,即使二进制表示仅仅是0b11111111。但对于无符号值或有符号正值则不会发生这种情况。

升级后,对象表示(当您将memcpy转换为char数组时)可能会发生变化。这在有符号的情况下很容易看到,但在无符号的情况下,由于字节顺序的原因,字节的顺序可能不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63679696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档