gpt4 book ai didi

比较无符号与有符号不会发出警告(使用 const)

转载 作者:行者123 更新时间:2023-12-03 14:21:08 26 4
gpt4 key购买 nike

简单:如果我在 GCC 中测试有符号变量与无符号变量,则在编译 -Wall 时我会收到警告。
使用此代码:

#include <stdio.h>

int main(int argc, char* argv[])
{
/* const */ unsigned int i = 0;
if (i != argc)
return 1;
return 0;
}

我收到此警告:
<source>: In function 'int main(int, char**)':
<source>:6:8: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
6 | if (i != argc)
| ~~^~~~~~~
Compiler returned: 0
但是,如果我取消注释此 const - 编译器很高兴。我几乎可以在每个 GCC 版本上重现这个(见 https://godbolt.org/z/b6eoc1)。这是 GCC 中的错误吗?

最佳答案

我认为您缺少的是编译器优化。如果没有 const,该变量就是一个变量,这意味着它可以改变。由于它是一个无符号整数,这意味着它确实可以大于整数。

const unsigned int i = 2147483648;
如果将大于 int 的最大值的值分配给该 unsigned int,则会恢复错误。
但是如果它是const,编译器知道它的值,它知道它不会改变,并且比较不会有问题。
如果你看一下程序集,你会看到没有const,它实际上是拿变量的值来比较:
movl    $0, -4(%rbp)
movl -20(%rbp), %eax
cmpl %eax, -4(%rbp)
现在,如果它是 const,它根本不会打扰变量,它只需要值:
movl    $0, -4(%rbp)
cmpl $0, -20(%rbp)

关于比较无符号与有符号不会发出警告(使用 const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65776263/

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