C变量是饱和的还是环绕的?

C变量是饱和的还是环绕的?,c,variables,C,Variables,如果我继续递增C变量,它是饱和还是环绕?对于有符号整数类型,它是未定义的 对于无符号整数类型,它将环绕(即返回到0)。快速回答:它取决于变量的数据类型。整数类型是环绕的,浮点类型是饱和的。你的意思是,按照标准的规定,还是所有PC编译器的实际情况?如果你面临(潜在)这个问题,你应该重新考虑算法。@hyde:我的意思是,它会在实际中发生。我不敢说它是由标准定义的,我在某处看到了一个巨大的讨论,所以没有得出一个明确的结论conclusion@Milad“SSE”/“MMX”指令通常具有整数运算的饱和版

如果我继续递增
C
变量,它是饱和还是环绕?

对于有符号整数类型,它是未定义的


对于无符号整数类型,它将环绕(即返回到0)。

快速回答:它取决于变量的数据类型。整数类型是环绕的,浮点类型是饱和的。你的意思是,按照标准的规定,还是所有PC编译器的实际情况?如果你面临(潜在)这个问题,你应该重新考虑算法。@hyde:我的意思是,它会在实际中发生。我不敢说它是由标准定义的,我在某处看到了一个巨大的讨论,所以没有得出一个明确的结论conclusion@Milad“SSE”/“MMX”指令通常具有整数运算的饱和版本,如果它真的很重要(例如对于性能关键型操作).TIL
C
中的有符号整数不构成加法下的一组。@JanDvorak溢出时有符号整数的行为未定义,因为C作为语言/标准支持不同的负数二进制表示,因此它必须保持有符号整数溢出未定义。@Jan:例如,您如何定义
INT\u MAX+1
为符号大小表示?如果是
INT\u MIN+1
则整数不是一个组,因为
INT\u MIN+1-1
不能同时是
INT\u MIN
INT\u MAX
。如果将其设置为
INT\u MIN
,则奇数加上奇数将产生奇数。它是一个加法组,但仍然不是一个环。使有符号整数溢出未定义还可以启用某些循环优化,否则这些优化将不可能实现:例如,允许编译器为(inti=0;i引人注目的是,如果
i
被签名,那么编译器可以假设
if(i+1
始终为false,并将其后面的子句作为死代码删除。同样,它可以通过排除导致溢出的情况来简化其他表达式。如果
i
未签名(且类型至少与
int
一样宽)然后,它必须实际执行一个测试,并在发生环绕的情况下执行代码。我不认为这些优化促使做出溢出UB的决定,但因为它是UB,所以优化是可用的。