5

C99標準では、データ型の範囲を次のように定義しています。

— minimum value for an object of type signed char
SCHAR_MIN -127 // −(2^7 − 1)
— maximum value for an object of type signed char
SCHAR_MAX +127 // 2^7 − 1
— maximum value for an object of type unsigned char
UCHAR_MAX 255 // 2^8 − 1
— minimum value for an object of type char
CHAR_MIN see below
— maximum value for an object of type char
CHAR_MAX see below
— maximum number of bytes in a multibyte character, for any supported locale
MB_LEN_MAX 1
— minimum value for an object of type short int
SHRT_MIN -32767 // −(2^15 − 1)
— maximum value for an object of type short int
SHRT_MAX +32767 // 2^15 − 1
— maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 2^16 − 1
— minimum value for an object of type int
INT_MIN -32767 // −(2^15 − 1)
— maximum value for an object of type int
INT_MAX +32767 // 2^15 − 1
— maximum value for an object of type unsigned int
UINT_MAX 65535 // 2^16 − 1
— minimum value for an object of type long int
LONG_MIN -2147483647 // −(2^31 − 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2^31 − 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 2^32 − 1

負の範囲が見られる場合、それは実際には、許容される2つの補数表現に従ってここで定義されているものより1つ多い可能性があります。なぜそれらはこのように定義されているのですか?

4

2 に答える 2

10

負の範囲が表示された場合、実際には、許容される2の補数表現に従ってここで定義されている範囲より1つ多い可能性があります。なぜそれらはこのように定義されているのですか?

Cは古い(そして新しい!)アーキテクチャ用にも設計されているため、符号付き整数に2の補数表現を必ずしも使用する必要はありません。実際、C11標準では3つの表現が許可されています(これらのうち、実装定義が適用されます)。

§6.2.6.2整数型

符号ビットが1の場合、値は次のいずれかの方法で変更されます。

—符号ビット0の対応する値は無効になります(符号と大きさ
—符号ビットの値は-(2 M)(2の補数)です。
—符号ビットの値は-(2 M − 1)(1の補数)です。

したがって、1の補数表現では、最小値は-(2^M - 1)です。ただし、例外があります。C99オプション型intxx_tは、2の補数表現で格納されることが保証されています(そのため、オプションがあります。C標準はこの表現を強制しません)。

于 2012-10-18T15:17:06.877 に答える
4

2の補数は必要ないためです。C99は、符号ビットと大きさ、または1の補数を持つアーキテクチャに実装できる可能性があります。

于 2012-10-18T14:59:46.703 に答える