#include <cstdint>
#include <iostream>
int main() {
uint32_t i = -64;
int32_t j = i;
std::cout << j;
return 0;
}
我尝试过的大多数编译器都会创建输出的程序-64
,但是这是定义的行为吗?
- 是将有符号整数赋值给无符号整数
uint32_t i = -64;
定义的行为?
- 是有符号整数赋值
int32_t j = i;
, when i
equals 4294967232
,定义的行为?
对于无符号整数越界转换,结果是定义的;对于有符号整数,它是实现定义的。
C++11(ISO/IEC 14882:2011) §4.7 积分转换 [conv.integral/2]
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2^n,其中 n 是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。 ——尾注]
如果目标类型是有符号的,并且可以用目标类型(和位字段宽度)表示,则该值不会改变;否则,该值是实现定义的。
对于 C++14,此文本保持不变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)