当一个人在小于int的算术类型上执行位操作时,它会自动提升为int。
std::uint8_t a = 42;
auto b = a | 0x0f;
// b will be of type int我还不能确定的是,在这个提升过程中到底发生了什么,特别是因为它正在从无符号整数转换为有符号整数。a的数值是否会保持一致,从而潜在地改变二进制表示法?或者,二进制表示是否保持一致,从而可能导致不同的数值?
是否存在将该值提升为int而不是unsigned int的原因?后者不会引起任何这种混乱。
发布于 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数组时)可能会发生变化。这在有符号的情况下很容易看到,但在无符号的情况下,由于字节顺序的原因,字节的顺序可能不同。
https://stackoverflow.com/questions/63679696
复制相似问题