符号なし整数のオーバーフローは、符号付き整数のオーバーフローとは異なり、Cで明確に定義されていることを多くの場所で読んだことがあります。
アンダーフローは同じですか?
例えば:
unsigned int x = -1; // Does x == UINT_MAX?
ありがとう。
どこにあるか思い出せませんが、符号なし整数型の算術演算がモジュール式であるとどこかで読んだので、その場合は-1 == UINT_MAX mod(UINT_MAX + 1)です。
符号なし整数のオーバーフローは、符号付き整数のオーバーフローとは異なり、Cで明確に定義されていることを多くの場所で読んだことがあります。
アンダーフローは同じですか?
例えば:
unsigned int x = -1; // Does x == UINT_MAX?
ありがとう。
どこにあるか思い出せませんが、符号なし整数型の算術演算がモジュール式であるとどこかで読んだので、その場合は-1 == UINT_MAX mod(UINT_MAX + 1)です。
§6.2.5、パラグラフ9:
結果の符号なし整数型で表現できない結果は、結果の型で表現できる最大値より1大きい数を法として減少するため、符号なしオペランドを含む計算はオーバーフローすることはありません。
編集:
申し訳ありませんが、間違った参照ですが、結果はまだ固定されています。正しい参照は§6.3.1.3(符号付きおよび符号なし整数変換)です。
新しいタイプが符号なしの場合、値は、値が新しいタイプの範囲内になるまで、新しいタイプで表すことができる最大値より1つ多い値を繰り返し加算または減算することによって変換されます。
そうです、x == UINT_MAX
。
-1は、2の補数として表される場合、数値のビット数が0xFF...Fになります。符号なし数値スペースでは、その値は可能な最大値です(つまり、すべてのビットが設定されます)。したがって、はい、x==UINT_MAXです。次のコードは、C99strictコンパイラで「1」を出力します。
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
int main(int argc, char **argv){
uint32_t x = -1;
printf("%d", x == UINT_MAX ? 1 : 0);
return 0;
}
符号付きと符号なしの数値が混在していますが、これはクールではありません。
unsigned int x = 0u - 1u; // is OK though