小编att*_*rri的帖子

无符号整数加法是否可以调用未定义的行为?

编辑:更改了值,USHRT_MAX因为它不符合注释所示.


想象一下,你有一个奇特的编译器,其limit.h中定义的整数类型限制是:

#define INT_MAX   2147483647   /* Typical 32-bit system value */
#define USHRT_MAX 2147483647   /* ***Edited***, original question had 2000000000 */
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我有以下代码:

unsigned short a = 1500000000;
unsigned short b = 1500000000;
unsigned short c;
c = a + b;
Run Code Online (Sandbox Code Playgroud)

据我所知,最后一条指令会发生什么:

  1. 整体推广a.由于int可以采取所有的价值unsigned short,a得到晋升int.
  2. 出于同样的原因,b晋升为int.
  3. 添加发生在int类型上.
  4. 结果无法表示int.由于第6.5/5段引起的未定义行为.

我的推理是否正确?这是否真的会调用未定义的行为,或者我哪里出错了?请注意,我的代码仅适用于无符号类型,并且由于无符号类型的合法溢出,可能会出现对无符号整数应用模数的结果.

如果上一个问题的答案是" 是,未定义的行为 ",那么这对于符合法律的合规编译器来说就是这样.那么,你能说我发布的应用程序代码不正确吗?是否所有非显式转换的小无符号整数都可能会调用未定义的行为?

c integer-promotion language-lawyer

12
推荐指数
2
解决办法
296
查看次数

这种严格别名规则违规是否会产生我期望的行为?

我知道违反严格别名规则是根据C标准的未定义行为.请不要告诉我这是UB,没有什么可谈的.

我想知道下面的代码是否有编译器没有预期的行为(由我在下面定义).

假设的大小floatint为4个字节,并且大端机.

float f = 1234.567;  /* Any value here */
unsigned int u = *(unsigned int *)&f;
Run Code Online (Sandbox Code Playgroud)

我在英语单词中的预期行为是"获取float存储的四个字节并按int 原样放入".在代码中它将是这个(我认为这里没有UB):

float f = 1234.567;  /* Any value here */
unsigned char *p = (unsigned char *)&f;
unsigned int u = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
Run Code Online (Sandbox Code Playgroud)

我也欢迎实际和具体的例子,为什么,除了按照标准的UB,编译器会有我认为是意想不到的行为.

c strict-aliasing undefined-behavior

0
推荐指数
1
解决办法
94
查看次数