limits.h 標準ライブラリー・ヘッダー・ファイルで定義される long 型整数の限界は、次の表で示すように、32 ビット・モードと 64 ビット・モードでは異なります。
| シンボリック 定数 |
モード | 値 | 16 進数 | 10 進数 |
|---|---|---|---|---|
| LONG_MIN (signed long の最小値) | 32 ビット | –(231) | 0x80000000L | –2,147,483,648 |
| 64 ビット | –(263) | 0x8000000000000000L | –9,223,372,036,854,775,808 | |
| LONG_MAX (signed long の最大値) | 32 ビット | 231–1 | 0x7FFFFFFFL | +2,147,483,647 |
| 64 ビット | 263–1 | 0x7FFFFFFFFFFFFFFFL | +9,223,372,036,854,775,807 | |
| ULONG_MAX (unsigned long の最大値) | 32 ビット | 232–1 | 0xFFFFFFFFUL | +4,294,967,295 |
| 64 ビット | 264–1 | 0xFFFFFFFFFFFFFFFFUL | +18,446,744,073,709,551,615 |
この違いにより、次のような現象が生じます。
他の変数に割り当てたり、関数に渡されるときに long 値がオーバーフローする場合は、以下を行う必要があります。