将无符号数转换为有符号数,位级别会发生什么?

3

可能是重复问题:
当二进制运算符两边的有符号性不同时,促销规则如何工作?

当从无符号整数转换为有符号整数时,我知道变量的位表示会发生变化。例如,将255从uint8转换为int8时,它可能会变成-1。但是,我从来没有确定“转换”或“强制类型转换”对底层位本身意味着什么。

我的问题是,在有符号和无符号类型之间进行static_cast后,整数变量的原始位模式是否保证保持不变,或者是否可能被转换方式改变?

出于好奇,整数符号类型之间的static_cast是否会生成汇编代码,还是仅用于让编译器知道要生成哪些汇编指令?

编辑:

这里是我想了解的一种情况的示例:

unsigned int uintvar = random();
unsigned int control = uintvar;
assert(control == static_cast<unsigned int>(static_cast<signed int>(uintvar)));

忽略双重转换会被优化的事实,这个例子是否保证始终成立?

6
实际上,什么也没有改变。 - Mysticial
4
如果有符号整数的表示不是二进制补码,而你将一个负值转换成无符号类型,那么位模式实际上会发生改变。 - Daniel Fischer
@DanielFischer 该死的丹尼尔,我的评论点赞已经用完了,还要再等两个小时才能继续 =( 同意你的观点。 - WhozCraig
我收到了一些混乱的信号,啊哈。也许我可以添加一些内容来澄清问题吗? - Anne Quinn
Clairvoire - 如果位表示是二进制补码,则什么都不会改变。我不知道任何一个即使稍微流行一点的系统也不使用二进制补码,但这并不是标准所规定的,因此DanielFischer的回答想表达的是它可能会改变。 - sapi
2个回答

8
位模式本身并不会改变(在实际遇到的大多数体系结构上)。区别在于编译器生成的指令来操作这些值。

4
如果无符号值太大而无法适应有符号对应值,则行为未定义。
255变成-1,因为在二进制补码中这些位是-1。位数不会发生变化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接