gpt4 book ai didi

c - -fwrapv 有什么作用?

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

任何人都可以提供一些代码示例,这些示例在使用 -fwrapv 编译时与不使用时表现不同吗?

gcc documentation表示 -fwrapv 指示编译器假定加法、减法和乘法的带符号算术溢出使用二进制补码表示形式回绕

但是每当我尝试溢出时,无论有没有 -fwrapv,结果都是一样的。

最佳答案

想想这个函数:

int f(int i) {
return i+1 > i;
}

从数学上讲,对于任何整数 ii+1 应该总是大于 i。但是,对于 32 位 inti 有一个值使该语句为假,即 2147483647(即 0x7FFFFFFF,即 INT_MAX)。向该数字加一会导致溢出,根据 2 的补码表示,新值将环绕并变为-2147483648。因此,i+1>i 变为 -2147483648>2147483647,这是错误的。

当您不使用 -fwrapv 进行编译时,编译器会假定溢出是“非环绕”的,并且会优化该函数以始终返回 1(忽略溢出情况)。

-fwrapv编译时,函数没有优化,会有加1比较逻辑两个值,因为现在溢出是“环绕”的(即溢出的数字将根据 2 的补码表示进行环绕)。

generated assembly 中可以很容易地看出差异- 在右 Pane 中,没有 -fwrapv,函数总是返回 1 (true)。

关于c - -fwrapv 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232954/

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