user-0 提问: 数值溢出问题  

回复:
user: user-1
content: 验证一下min min的补码为  1000 0000 0000 0000 -1 的补码为     1111 1111  1111  1111 两个相加得到结果的补码   0111 1111 1111  1111 （进位溢出） 结果为正数  所以其原码为 0111 1111 1111  数值是+32767 计组课没白上，还记得一点！

user: user-2
content: 说点别的:  1) maxShortInt + 1 的结果是一个 int （不是 short ），并且超出的 short 的表示范围。（我们假设他没有超出 int 的表示范围） [quote6.5.6/]4 If both operands have arithmetic type, the usual arithmetic conversions are performed on them.[/quote]  2) 关于 %hd :   引用7.21.6.1/7 ... h Specifies that a following d, i, o, u, x, or X conversion specifier applies to a short int or unsigned short int argument (the argument will have been promoted according to the integer promotions, but its value shall be converted to short int or unsigned short int before printing); or that a following n conversion specifier applies to a pointer to a short int argument. 及： 引用7.21.6.1/9 If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined. 所以严格的说这是一个未定义行为（对于 printf 来说）  3) 将 int 转换为 short: 引用6.3.1.3 Signed and unsigned integers 1 When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.60) 3 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised. 当结果不在 short 的表示范围内的时候，结果是有实现定义的。

user: user-3
content: 上面写错了 最大值为-  最小值为+

user: user-3
content: 建议查看  《深入理解计算机系统》 此书第一章详细讲解了关于数值运算的上溢出，下溢出的问题。 1 当为最大值时也就是超过计算机位数时 +1 等于    x（设此时值） - 2^32or64（计算机位数） 2 当为最小值时为    x-2^32or64

user: user-4
content: -32768 二进制为 1000 0000 0000 0000  最高位的1是表示是负数  再减1后变成0111 1111 1111 1111  最高位是0，表示正数，这个数值就为32767   32767 + 1 同理

user: user-1
content: 如果位数为n,则-2的n-1次方的补吗为 1000  0000(假如n为8，理解不了就记一下，这个是特殊的)

user: user-0
content: 引用 9 楼 zycxnanwang 的回复:验证一下min min的补码为  1000 0000 0000 0000 -1 的补码为     1111 1111  1111  1111 两个相加得到结果的补码   0111 1111 1111  1111 （进位溢出） 结果为正数  所以其原码为 0111 1111 1111  数值是+32767 计组课没白上，还记得一点！  MIN的原码是  1111 1111 1111 1111 它的补码应该是  1000 0000 0000 0001 吧  再加上-1的补码 1111 1111 1111 1111  得到的补码是 0000 0000 0000 0000    哎呀我的天啊，我这是怎么算的  哪个大哥再来帮我疏通一下

user: user-5
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-6
content: 引用 5 楼 Hamber_Bao 的回复:[quote=引用 3 楼 u010165006 的回复:] printf("max=%hX, max+1=%hX\n", maxShortInt,maxShortInt+1); //输出max=7FFF, max+1=8000 //二进制为：max=7FFF=0111 1111 1111 1111 为16位补码表示整数的最大值32767（首位0为正数） //max+1=8000=1000 0000 0000 0000 //首位1为负数，绝对值等于取反加一，取反刚好等于max（32767），+1后等于32768（绝对值），因为负数所以值等于-32768 printf("min=%hX, min-1=%hX\n", minShortInt,minShortInt-1); //输出min=8000, min-1=7FFF   我标记为红的，是什么意思，能给我详细解释解释吗[/quote]  详细的要看《计算机组成原理》（计算机组成与结构）一本书，关于原码、补码、反码及计算。

user: user-7
content: 楼主同类问题提得太多，其实只要去认真学习一下原码、补码、机器数、浮点数什么的就完全明白了

user: user-0
content: 引用 3 楼 u010165006 的回复:printf("max=%hX, max+1=%hX\n", maxShortInt,maxShortInt+1); //输出max=7FFF, max+1=8000 //二进制为：max=7FFF=0111 1111 1111 1111 为16位补码表示整数的最大值32767（首位0为正数） //max+1=8000=1000 0000 0000 0000 //首位1为负数，绝对值等于取反加一，取反刚好等于max（32767），+1后等于32768（绝对值），因为负数所以值等于-32768 printf("min=%hX, min-1=%hX\n", minShortInt,minShortInt-1); //输出min=8000, min-1=7FFF   我标记为红的，是什么意思，能给我详细解释解释吗

user: user-8
content: short maxShortInt = 32767; //最大 short int。 short minShortInt = -32767;//最小 short int。 short ShortdownLimited = -32767 - 1; //最小可表示数。//这本来是-0 的编码，只是 带符号数，无 -0 这样就用来表示 -32768了; 似乎应该这么写。 现在库里的代码，差不多都改成类似这样了 至于输出， ShortdownLimited 还是输出  -32768;  最大数maxShortInt+1溢出变成最小可表示数 -32768（这个也是 -0的编码）。 最小数minShortInt-1溢出变成最小可表示数 -32768（这个也是 -0的编码）。 最小可表示数 -32768（这个也是 -0的编码） -1  溢出变成最大数maxShortInt。

user: user-6
content: printf("max=%hX, max+1=%hX\n", maxShortInt,maxShortInt+1); //输出max=7FFF, max+1=8000 //二进制为：max=7FFF=0111 1111 1111 1111 为16位补码表示整数的最大值32767（首位0为正数） //max+1=8000=1000 0000 0000 0000 //首位1为负数，绝对值等于取反加一，取反刚好等于max（32767），+1后等于32768（绝对值），因为负数所以值等于-32768 printf("min=%hX, min-1=%hX\n", minShortInt,minShortInt-1); //输出min=8000, min-1=7FFF

user: user-0
content: 顶顶顶顶顶顶顶顶顶顶顶顶

user: user-0
content: 求各位大神帮助啊