user-0 提问: iso标准中int的最小值为什么是-32767

回复:
user: user-0
content: 引用 2 楼 fefe82 的回复:5.2.4.2.1 Sizes of integer types <limits.h> 1 The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.  标准只是给了一个范围限制而已，并没有规定一定是这个值。  至于为什么是 -32767 而不是 -32768 ，因为标准对有符号数允许三种不同的表示方式，原码、反码、补码（最常用的）。 16bit 原码与反码都无法表示 -32768。 6.2.6.2 Integer types 2 ............................ If the sign bit is one, the value shall be modified in one of the following ways: — the corresponding value with sign bit 0 is negated (sign and magnitude);     // 原码 — the sign bit has the value −(2^N) (two’s complement);                                         // 补码 — the sign bit has the value −(2^N − 1) (one’s complement).                                 // 反码  另外，标准允许在在有符号数中，用某一个值表示异常：(原码和补码的 10000000 ，反码的 1111111111) .... is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for one’s complement), is a trap representation or a normal value.  如果使用异常值的话，三种编码都无法表示 -32768 。 谢谢回复，很容易钻牛角尖

user: user-1
content: http://en.cppreference.com/w/cpp/language/types

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-3
content: 因为 -32768 这个数，对应的编码比较特殊 不是很符合有符号数的定义 首先， -32768  的绝对值是 32768，但是32768 不在 16 Bits有符号数的编码范围，因此也只能用， -32768  的编码表示 但是 32768 是个正数， -32768  的编码 最高位是（符号位）1，是个负数 这不符号绝对值的定义  其次，这个编码除了符号位，每一位都是0 他其实是-0 的编码，不符合 ，补码表示的有符号数的的含义 补码数中，负数 是他的相反数（一个正数）的补码，也就是相反数的反码+1  -32768这个数，他的相反数不在 16 Bits有符号数的编码范围，因而，也不是很符合这个相反数的补码关系 它是它自己的补码，这是只有0 才具有的性质，因为 0 = +0 = -0 从这些方面看， -32768  是个很尴尬的数值 因此，标准里就把有符号数的编码范围 缩小了，16Bits 中，把 -32768排除出去了 不同位数的类似的编码，也是一样处理的。

user: user-4
content: 5.2.4.2.1 Sizes of integer types <limits.h> 1 The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.  标准只是给了一个范围限制而已，并没有规定一定是这个值。  至于为什么是 -32767 而不是 -32768 ，因为标准对有符号数允许三种不同的表示方式，原码、反码、补码（最常用的）。 16bit 原码与反码都无法表示 -32768。 6.2.6.2 Integer types 2 ............................ If the sign bit is one, the value shall be modified in one of the following ways: — the corresponding value with sign bit 0 is negated (sign and magnitude);     // 原码 — the sign bit has the value −(2^N) (two’s complement);                                         // 补码 — the sign bit has the value −(2^N − 1) (one’s complement).                                 // 反码  另外，标准允许在在有符号数中，用某一个值表示异常：(原码和补码的 10000000 ，反码的 1111111111) .... is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for one’s complement), is a trap representation or a normal value.  如果使用异常值的话，三种编码都无法表示 -32768 。

user: user-5
content: 标准是一方面，编译器的实现是另一回事儿 C语言的标准规定int的范围最小是-32767到32767，但具体到编译器实现就不一定了，16位机时，大部分实现都是-32768到32767