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

如果我们看到负范围,它实际上可能比这里根据允许的二进制恭维表示定义的范围大一。为什么它们是这样定义的?

4

2 回答 2

10

如果我们看到负值范围,它实际上可能比此处根据允许的二进制补码表示定义的值多一。为什么它们是这样定义的?

因为 C 也是为旧的(和新的!)架构设计的,它不一定对有符号整数使用二进制补码表示。C11 标准确实允许三种表示形式(其中适用的是实现定义的):

§ 6.2.6.2 整数类型

如果符号位为 1,则该值应通过以下方式之一进行修改:

— 符号位 0 的对应值被取反(符号和幅度
— 符号位的值为 -(2 M )(二进制补码);
— 符号位的值为 −(2 M − 1)(个数补码)。

所以,用一个的补码表示,最小值是-(2^M - 1)。但是,有一个例外:C99 可选类型intxx_t,保证以二进制补码表示形式存储(这就是为什么存在可选类型:C 标准不强制这种表示形式)。

于 2012-10-18T15:17:06.877 回答
4

因为不需要二进制补码。C99 可以在具有符号位和幅度或补码的体系结构上实现。

于 2012-10-18T14:59:46.703 回答