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