使用-fwrapv时,gcc中的签名溢出仍然是未定义的行为吗?

时间:2019-03-01 22:33:31

标签: c gcc language-lawyer

背景

默认情况下,签名的溢出是不确定的行为。

我对gcc(基于https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.htmlWhat does -fwrapv do?的理解是,使用-fwrapv使gcc将签名溢出视为定义明确的行为。

但是,在另一个question上的注释似乎表明,即使打开此标志,带符号的溢出仍然是未定义的行为。

问题

使用-fwrapv在gcc中定义的签名溢出是否正确?如果不是,那么-fwrapv的目的是什么?

1 个答案:

答案 0 :(得分:6)

给出the GCC documentation说:

  

-fwrapv

     

此选项指示编译器假定使用二进制补码表示法来进行加,减,乘的有符号算术溢出。

我将其特征描述为特定于实现的扩展,它为标准C中未定义的行为提供了明确定义的行为-当且仅当底层硬件以这种方式运行时才如此。

就目前而言,我会说这仍然是C标准中未定义的行为,但是您是在指示编译器以一种特定的,不可移植但可预测的方式运行。