【问题标题】:unsigned to signed conversion, what happens at the bit level? [duplicate]无符号到有符号的转换,在位级别会发生什么? [复制]
【发布时间】: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


【解决方案1】:

位模式根本没有改变(在您在实践中可能遇到的大多数架构上)。不同之处在于编译器生成的用于操作值的指令。

【讨论】:

    【解决方案2】:

    如果未签名的值太大而无法放入已签名的对应项中,则它是未定义的行为。

    255 变为 -1,因为这些位在二进制补码中是 -1。这些位没有任何反应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 2011-10-25
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2020-02-13
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多