gpt4 book ai didi

c - 这种对 int64_t 的处理是 GCC 和 Clang 错误吗?

转载 作者:IT王子 更新时间:2023-10-29 01:01:17 26 4
gpt4 key购买 nike

现在,你们中的一些人可能会想大喊未定义的行为,但是有一个问题。 int64_t 类型不是由 C 标准定义的,而是由 POSIX 定义的. POSIX 将此类型定义为:

a signed integer type with width N, no padding bits, and a two's-complement representation.

它不会将此留给实现来定义,而且绝对不允许将其视为无界整数。

linux$ cat x.c
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int stupid (int64_t a) {
return (a+1) > a;
}

int main(void)
{
int v;
printf("%d\n", v = stupid(INT64_MAX));
exit(v);
}

linux$ gcc -ox x.c -Wall && ./x
0
linux$ gcc -ox x.c -Wall -O2 && ./x # THIS IS THE ERROR.
1
linux$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

linux$ uname -a
Linux localhost 3.14.13-0-amd64 #1 SMP Sat Jul 26 20:03:23 BST 2014 x86_64 GNU/Linux
linux$ getconf LONG_BIT
32
linux$

显然,这里有一个问题......它是什么?
我是否错过了某种隐式转换?

最佳答案

我还是要喊未定义的行为

这里的推理很简单,编译器假定您是一个完美的程序员并且永远不会编写任何可能导致未定义行为的代码。

所以当它看到你的函数时:

int stupid (int64_t a) {
return (a+1) > a;
}

它假定您永远不会用 a==INT64_MAX 调用它,因为那将是 UB。

因此,这个函数可以简单地优化为:

int stupid (int64_t a) {
return 1;
}

然后可以根据需要内联。

我建议你阅读 What Every C Programmer Should Know About Undefined Behavior有关编译器如何利用 UB 进行优化的更多解释。

关于c - 这种对 int64_t 的处理是 GCC 和 Clang 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com