位运算补充:复习整数表示范围

位运算的示例代码如下:
#include  < iostream >
using namespace std;
int  main()
{
 cout 
<<   " lenght of int =  "   <<  sizeof( int <<  endl; 
    
int  a  =   ~ 5 ;
    
int  b  =   ~ ( - 6 );
    cout 
<<   " ~5 =  "   <<  a  <<  endl;
    cout 
<<   " ~(-6) =  "   <<  b  <<  endl;
    
    
int  i  =   0x7ffffffd ; // 整数的16进制表示方法,在数字前加0x,比如0x10表示的是16,0x0a表示的是10。8进制表示发是开始加0,如010表示8。
    cout  <<   " i = 01111111 11111111 11111111 11111101 =  "   <<  i  <<  endl;
    i 
=  i  <<   1 ;
    cout 
<<   " i << 1 =  "   <<  i  <<  endl;
    
    
int  t  =   0x7fffffff ;
    cout 
<<   " t = 01111111 11111111 11111111 11111111 =  "   <<  t  <<  endl;
    
int  k  =  t  +   1 ;
    cout 
<<   " k = t + 1 "   <<  endl;
    cout 
<<   " k = 10000000 00000000 00000000 00000000 =  "   <<  t  +   1   <<  endl;
    cout 
<<   " k = t + 2 "   <<  endl;
    cout 
<<   " k = 10000000 00000000 00000000 00000000 =  "   <<  t  +   2   <<  endl;
        
    getchar(); 
}
int型是4字节,32位,因为有符号,所以表示范围是[-2^31, 2^31-1]。即[-2147483648, 2147483647]。为什么负数会比整数多一个呢?
32位太长,我们以4位的例子来说明。
假设一个有符号整数有4位表示,比如0111表示7,原码1111表示-7,但是-7的补码是1001,0001表示1,原码1001表示-1,但是-1的补码是1111。
那根据范围公式,4位有符号数的范围是[-8, 7]。
7由0111表示,那么-8是哪个表示呢?经实验分析,发现-8的补码表示为1000。为什么是这样呢?我认为这就是一种规定,就像为什么1表示true,0表示false呢?都是规定,记住就好了。下面我根据我的理解,进行一下牵强的解释。
[-8, 7]为什么整数有7个,而负数有8个?4位的组合一共有2^4共16个,下面是4位编码和表示的对照表,编码使用补码。
0000      0
0001      1
0010      2
0011      3
0100      4
0101      5
0110      6
0111      7
1000      - 8
1001      - 7
1010      - 6
1011      - 5
1100      - 4
1101      - 3
1110      - 2
1111      - 1

由此可见,随着二进制表示的补码的不断增加,所表示的数从0,增加到整数最大,接着到负数最小,然后到-1。32位的int型也是这样的。当到最大正数时,再加1,就会到最小负数,也就是绝对着最大的负数。
16个数中,7个整数,1个零,另外7个是-1到-7。最后剩的-0,也就是1000,被定义为表示-8。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值