Rus*_*lan 15 c int integer-overflow undefined-behavior
在C99中,有一些(可选的)类型int8_t
,int16_t
例如,它们保证具有精确指定的宽度和没有填充位,并且表示二进制补码(7.18.1.1)中的数字.在6.2.6.2中,有符号整数溢出被提及为脚注44)和45),即它可能导致在填充位中捕获值.
由于intN_t
没有任何填充位,并且它们保证是两个补码,这是否意味着它们的溢出不会产生任何未定义的行为?什么是例如溢出乘法的结果?添加怎么样?2^N
对于无符号类型,结果是否减少了模数?
小智 8
脚注不是规范性的.如果一个脚注声明溢出会导致在填充位中捕获值,那么这并不是真的错误,但我可以看出它有多么误导.规范性文本仅表示行为未定义.将陷印值放在填充位中是未定义行为的一种可能结果,但不是唯一的结果.
所以不,这并不意味着定义了溢出.涉及intN_t
/ uintN_t
操作数的操作可能会溢出,并且溢出会导致未定义的行为.
像int8_t i = 127; ++i;
没有UB的东西.int8_t
如果您已经写好,则会进行整体促销i = (int8_t) ((int) i + 1);
.添加本身不会溢出,转换回int8_t
产生实现定义的结果.
类似于uint16_t u = 65535; u *= u;
UB的当前典型实现int
具有32个符号/值位.uint16_t
也可以进行整体促销,因此乘法就像你写的一样u = (uint16_t) ((int) u * (int) u);
.乘法本身溢出,行为未定义.
int64_t i = 9223372036854775807; ++i;
在几乎所有实现中都有类似UB的东西.添加本身溢出.
归档时间: |
|
查看次数: |
292 次 |
最近记录: |