gpt4 book ai didi

c - 如何防止 gcc 优化器产生不正确的位操作?

转载 作者:太空狗 更新时间:2023-10-29 16:23:11 26 4
gpt4 key购买 nike

考虑以下程序。

#include <stdio.h>

int negative(int A) {
return (A & 0x80000000) != 0;
}
int divide(int A, int B) {
printf("A = %d\n", A);
printf("negative(A) = %d\n", negative(A));
if (negative(A)) {
A = ~A + 1;
printf("A = %d\n", A);
printf("negative(A) = %d\n", negative(A));
}
if (A < B) return 0;
return 1;
}
int main(){
divide(-2147483648, -1);
}

当它在没有编译器优化的情况下编译时,它会产生预期的结果。

gcc  -Wall -Werror -g -o TestNegative TestNegative.c
./TestNegative
A = -2147483648
negative(A) = 1
A = -2147483648
negative(A) = 1

当使用编译器优化进行编译时,它会产生以下不正确的输出。

gcc -O3 -Wall -Werror -g -o TestNegative TestNegative.c
./TestNegative
A = -2147483648
negative(A) = 1
A = -2147483648
negative(A) = 0

我正在运行 gcc 5.4.0 版

我是否可以在源代码中进行更改以防止编译器在 -O3 下产生此行为?

最佳答案

  1. -2147483648 并不像您认为的那样。 C 没有负常数。包括 limits.h 并改用 INT_MIN(二进制补码机上几乎每个 INT_MIN 定义都将其定义为 (-INT_MAX - 1 ) 有充分的理由)。

  2. A = ~A + 1; 调用未定义的行为,因为 ~A + 1 导致整数溢出。

这不是编译器,而是您的代码。

关于c - 如何防止 gcc 优化器产生不正确的位操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48761870/

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