关于左移和右移:
- 逻辑左移和算数右移结果完全相同:符号位会被丢弃,然后低位补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的最大值。