【发布时间】:2013-01-05 01:44:18
【问题描述】:
可能重复:
How do promotion rules work when the signedness on either side of a binary operator differ?
当从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)));
忽略双重转换会被优化掉的事实,这个例子能保证永远成立吗?
【问题讨论】:
-
其实没有任何变化。
-
好吧,如果有符号整数的表示不是二进制补码,并且您将负值转换为无符号类型,那么位模式确实会发生变化。
-
@DanielFischer 该死的丹尼尔,我在 cmets 上还有 2 个小时没有投票了 =( 对此 +1。
-
我收到了一些混合信号,啊哈。有什么我可以补充的来澄清这个问题吗?
-
Clairvoire - 如果位表示是二进制的恭维,则没有任何变化。我不知道任何不使用二进制恭维的远程主流系统,但这不是标准规定的,所以 DanielFischer 的回答是它可以改变。
标签: c++ integer bit-manipulation