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
如果我们看到负范围,它实际上可以比根据允许的两个赞美表示定义的范围多一个。为什么他们这样定义?
答案 0 :(得分:10)
如果我们看到负范围,它实际上可以比根据允许的二进制补码表示定义的值多一个。为什么他们这样定义?
因为C也是为旧(和新!)体系结构设计的,它们必然使用二进制补码表示来表示有符号整数。 C11标准确实允许三种表示(其中之一适用于实现定义):
§6.2.6.2整数类型
如果符号位为1,则应以下列方式之一修改该值:
- 符号位0的相应值被否定(符号和幅度)
- 符号位的值为 - (2 M )(两个补码);
- 符号位的值为 - (2 M - 1)( 1'补码)。
因此,对于补码表示,最小值为-(2^M - 1)
。但是,有一个例外:C99可选类型intxx_t
,它们被保证用两个补码表示存储(这就是为什么有可选:C标准不强制这种表示)。
答案 1 :(得分:4)
因为不需要两个补码。 C99可能在具有符号位和幅度或一个补码的架构上实现。