是否签名为无符号转换,然后返回,为整数定义行为?

12 c++ integer type-conversion undefined-behavior c++11

#include <cstdint>
#include <iostream>

int main() {
  uint32_t i = -64;
  int32_t j = i;

  std::cout << j;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的大多数编译器都会创建输出的程序-64,但是这个定义的行为是什么?

  • 是否为有符号整数赋值和无符号整数uint32_t i = -64;定义了行为?
  • 签名的整数赋值int32_t j = i;,当i等于时4294967232,是否定义了行为?

Yu *_*Hao 6

对于无符号整数超出范围的转换,定义结果; 对于有符号整数,它是实现定义的.

C++ 11(ISO/IEC 14882:2011)§4.7完整转换[conv.integral/2]

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 尾注]

如果目标类型已签名,则如果可以在目标类型(和位字段宽度)中表示该值,则该值不会更改; 否则,该值是实现定义的.

对于C++ 14,此文本保持不变.

  • @Sancho gcc将在某些优化级别实际上假设有符号整数溢出不会发生,并且如果您的代码试图检测它,则执行死代码消除!如果它确实发生了,它将是特定于平台的:无论硬件运行最有效的操作从无符号转换为有符号(在许多(大多数?)2s恭维机器上,为您提供您期望的结果) . (3认同)