【发布时间】:2013-09-30 10:24:39
【问题描述】:
#include <cstdint>
#include <iostream>
int main() {
uint32_t i = -64;
int32_t j = i;
std::cout << j;
return 0;
}
我尝试过的大多数编译器都会创建输出-64 的程序,但这是定义的行为吗?
- 有符号整数和无符号整数
uint32_t i = -64;的分配是否定义了行为? - 当
i等于4294967232时,有符号整数赋值int32_t j = i;是否定义了行为?
【问题讨论】:
-
为未签名但未签名定义
-
有一个微妙的区别,有符号算术运算符的溢出(这就是所谓的重复)是未定义的行为,但转换为有符号类型时的溢出是实现定义的行为。
-
这个问题最初的标题令人困惑地提到了签名溢出,但从代码示例中可以清楚地看出问题实际上是关于转换(包括确切值是'不可表示,通常不称为“溢出”)。我已经修正了标题,但这意味着链接的副本不是这个问题的答案。然而,接受的答案是正确的。
-
重新打开 - “重复”是一个不相关的问题
标签: c++ c++11 integer type-conversion undefined-behavior