计算char,short,int,long类型变量的取值范围

     源自《The C Programming Language》P28 pr2-1:

 

     编写一个程序以确定分别由signed及unsigned限定的char,short,int,long类型变量的取值范围。

 

     参考代码:

    

 

     分析:

    

      1,  <limits.h>包含了定义char int short long类型取值的最大值和最小值用常量表示(例如SCHAR_MIN = -128)

            所以直接打印即可。

 

      2,  如果要自己计算的话,则需要用到按位运算符~,>>,对于-(char)((unsigned char)~0 >> 1)解释:

 

           a: (unsigned char)~0用二进制表示为:11111111

           b: (unsigned char)~0 >> 1,将(unsigned char)~0逻辑右移1位,结果为:01111111

           c: (char)((unsigned char)~0 >> 1),将((unsigned char)~0 >> 1)由无符号类型强制转换为有符号类型

           d: -(char)((unsigned char)~0 >> 1),得到的二进制结果为11111111,最高位为符号为,对应的十进制

                  数为:-127

 

      3,  Q:为什么SCHAR_MIN = -128,而自己通过计算得到的char型变量的最小值为-127呢?

 

           A:绝大部分机器采用补码方式表示有符号整数,

                [-1]补码 = 11111111 ?

                -1 取绝对值 1

                  1 原码 00000001

                  1 反码 11111110

                  反码+1 11111111

                  符号位置为1 11111111 <-- -1的补码

            

               依次类推,[-2]补码 = 11111110 [-3]补码 = 11111101 ... [-128]补码 = 10000000,

               故char型最小值为-128。

 

               而自己通过计算得到的-127仅仅是将127取负作为最小值,其实在机器中它应该是倒数第二小值。

            

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值