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

Pet*_*vaz 5 c gcc language-lawyer

背景

默认情况下,signed overflow是未定义的行为.

我对gcc的理解(基于https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html-wwrapv做了什么?)是使用-fwrapv使gcc将签名溢出视为定义良好行为.

但是,对另一个问题的评论似乎表明,即使打开此标志,签名溢出仍然是未定义的行为.

是否使用-fwrapv在gcc中定义了溢出?如果没有,那么-fwrapv的目的是什么?

And*_*nle 6

鉴于海湾合作委员会的文件说:

-fwrapv

此选项指示编译器假设加法,减法和乘法的带符号算术溢出使用二进制补码表示.

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

迂腐地说,我认为它仍然是C标准的未定义行为,但是你指示编译器以特定的,非便携但可预测的方式行事.

  • 迂腐地说,没有一种被称为"未定义行为"的行为.标准不能强制定义未定义的行为,因为未定义的行为恰恰是标准不执行任何操作的情况.故意保持沉默.它不会禁止任何内容,包括可重现的结果.因此,实现可以定义行为而不违反标准. (7认同)
  • 请注意,有了这个好答案,一些有符号的溢出仍然是UB,就像在INT_MIN / -1中一样。 (2认同)