可能的重复项:
当二元运算符两端的符号不同时,提升规则如何工作?
当从 unsigned
整数转换为 signed
整数时,我知道变量位的表示形式会发生变化。 例如,当从 uint8
转换为 int8
时,255 可能会变为 -1。 但是,我从来不确定"转换"或"转换"对底层位本身意味着什么。
我的问题是,整数变量的原始位模式是否保证在有符号和无符号类型之间static_cast
后保持不变,或者是否有可能以某种方式被强制转换?
出于好奇,整数标牌类型之间的static_cast
是生成汇编,还是仅用于编译器知道要生成哪些 asm 指令?
编辑:
下面是我想知道的场景类型的示例:
unsigned int uintvar = random();
unsigned int control = uintvar;
assert(control == static_cast<unsigned int>(static_cast<signed int>(uintvar)));
忽略双播会被优化的事实,这个例子能保证永远成立吗?
位模式根本不会改变(在大多数架构上,您可能会在实践中遇到)。区别在于编译器生成的用于操作值的指令。
如果无符号值太大而无法放入有符号对应项,则它是未定义的行为。
255 变成 -1,因为这些位是 -1 的赞美。位什么也没发生。