求int型的最大取值和最小取值。

本文介绍了一种求取有符号int类型最大值和最小值的方法。通过将有符号0转换为无符号0并取反,然后右移一位来获取最大值;对于最小值,则通过对无符号1取反后右移一位再取反得到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#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。
 
*/

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值