原码反码补码、左移右移和数值类型的范围

关于左移和右移:

  • 逻辑左移和算数右移结果完全相同:符号位会被丢弃,然后低位补0.
  • 逻辑右移:左边高位空出,用0填补。
  • 算数右移:左边高位空出,用符号位填补。

原码反码和补码

以char型为例,有符号(负数char)在计算机中的存储方式是补码形式:

char x = -3;
则 x 的原码: 10000011
      反码: 11111100
      补码: 11111101
x<<1表示x左移一位,结果是11111010,是-6的补码。
x>>1表示x右移一位,结果是11111110,是-2的补码。

通过有符号数的补码来计算数值,以11111010,是-6的补码为例:

补码:11111010
反码:11111001
原码:10000110(-6)

求出各种数值类型的范围:

  • 方法一:使用标准头文件中的值

    #include<limits.h>
    SCHAR_MIN
    SHRT_MIN
    INT_MIN
    LONG_MIN
    UCHAR_MAX
    USHRT_MAX
    UINT_MAX
    ULONG_MAX
    
  • 方法二:直接计算

对于unsigned char:

unsigned char min = 0
unsigned char max = (unsigned char)~0 
#将数字0的各个二进制位全都变为1

对于signed char:

signed char min = -(char)((unsigned char) ~0>>1)
signed char max =  (char)((unsigned char) ~0>>1)

cout<<(char)((unsigned char) ~0>>1);//输出是一个字符
cout<<(int)((char)((unsigned char)~0 >> 1))//输出是127,也就是signed char的最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值