默认情况下,签名的溢出是不确定的行为。
我对gcc(基于https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html和What does -fwrapv do?的理解是,使用-fwrapv使gcc将签名溢出视为定义明确的行为。
但是,在另一个question上的注释似乎表明,即使打开此标志,带符号的溢出仍然是未定义的行为。
使用-fwrapv在gcc中定义的签名溢出是否正确?如果不是,那么-fwrapv的目的是什么?
答案 0 :(得分:6)
-fwrapv
此选项指示编译器假定使用二进制补码表示法来进行加,减,乘的有符号算术溢出。
我将其特征描述为特定于实现的扩展,它为标准C中未定义的行为提供了明确定义的行为-当且仅当底层硬件以这种方式运行时才如此。
就目前而言,我会说这仍然是C标准中未定义的行为,但是您是在指示编译器以一种特定的,不可移植但可预测的方式运行。