无符号到有符号的转换,在位级别会发生什么

unsigned to signed conversion, what happens at the bit level?

本文关键字:什么 符号 转换 无符号      更新时间:2023-10-16

可能的重复项:
当二元运算符两端的符号不同时,提升规则如何工作?

当从 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 的赞美。位什么也没发生。