#include<iostream.h>void main()...{ int max,min; max=((unsigned int)(~0))>>1; cout<<max<<endl; /**//* 关于如何求得int的最大取值: 假设有符号int型在系统中占用8位二进制码。 系统默认0是有符号的0,二进制码为0 000 0000,最高位的0是符号位(代表正数)。 如果把有符号的0全部取反,则会变成1 111 1111,最高位变成了1(代表负数),因此首先要把有符号0变成无符号0: unsigned int 0;相应的二进制码是0000 0000,最高位的符号位没有了。 然后对无符号0取反,变成1111 1111。根据题意,我们要求的是有符号int的最大值,如果直接就把1111 1111 转换成有符号类型则会出错(因为最高位是1,系统会把它认为是一个负数)。 把1111 1111向右移一位,变成0111 1111,最高位0在有符号int中代表正数,此时可以将0111 1111转换成有符号int型 0 111 1111=127 即一个占用8位的有符号int型的数据的最大取值是127。 */ min=(unsigned int)(~1)>>1; min=~min; cout<<min<<endl; /**//* 关于如何求得int的最小值: 同样假设有符号int型在系统中占用8位二进制码。 本来,如果把0(有符号)取反,0 000 0000->1 111 1111,就可以直接求出int的最小取值了。但是有趣的是,事实并非如此: ~0的结果是-1 ~1的结果是-2 ~2的结果是-3 ~3的结果是-4 为什么会是这样?那我们把以上参与的数字统统变成二进制码来看一下。 ~(0 000 0000) -> 1 111 1111 (应该是十进制的-127) 而事实上是1 000 0001 ~(0 000 0001) -> 1 111 1110 (应该是十进制的-126) 而事实上是1 000 0010 ~(0 000 0010) -> 1 111 1101 (应该是十进制的-125) 而事实上是1 000 0011 ~(0 000 0011) -> 1 111 1100 (应该是十进制的-124) 而事实上是1 000 0100 因此我怀疑在对有符号整型进行取反操作的时候,系统实际上是把除符号位意外的位统统保留原样,再最低位补1,即: ~0 000 0000 -> 1 000 0000 ->(最低位补1) 1 000 0001 ~0 000 0001 -> 1 000 0001 ->(最低位补1) 1 000 0010 ~0 000 0010 -> 1 000 0010 ->(最低位补1) 1 000 0011 ~0 000 0011 -> 1 000 0011 ->(最低位补1) 1 000 0100 所以在求有符号int型的最小取值的时候,我们应该先定义一个无符号1(0000 0001),对1进行取反(1111 1110),再将其右移动一位 0111 1111(高位补0,低位抛弃),然后转换成有符号(0 111 1111),再对其进行取反,(1 111 1111) -> (1 1000 0000)=-128. 但是这样就变成9位数了,因此我认为,系统在对有符号int进行取反的操作时,并没有真正对其低位补1,而是人为的规定了 1 000 0000 这个负数的起点 就是-1,而不是-0。 */}