郝斌老师C语言学习笔记----补码和位运算符

补码和位运算符

1. 补码

(1)已知十进制求二进制

**求正整数的二进制**
    除2取余,直至商为零,余数倒叙排序

**求负数的二进制**
    先求与该负数相对应的正整数的二进制代码,然后将所有位取反,末尾加1,不够位数时左边补1

**求零的二进制**
    全是零

(2)已知二进制求十进制

如果首位是0,则表明是正整数,按普通方法求

如果首位是1,则表明是负整数
    将所有位取反,再加一,所得数字就是该负数的绝对值

如果全是零,则对应的十进制也是零

Q : 一个int型的变量所能够存储的数据范围是多大?

int占4个字节,32位
int所能存储的最大值二进制表示:
0111 1111 1111 1111 1111 1111 1111 1111
用十六进制表示 : 0x7FFFFFFF

int所能存储的最小值二进制表示:
1000 0000 0000 0000 0000 0000 0000 0000
用十六进制表示 0x80000000

郝斌老师C语言学习笔记----补码和位运算符_第1张图片

2. 位运算符

(1)& —– 按位与

&& 逻辑与  是逻辑运算符(返回bool值)
& 位与和逻辑与完全不一样, &是按位比较

1&1 = 1
1&0 = 0
0&0 = 0

如 15 & 0 和 10 & 15 比较如下

1111 & 0000 = 0000
1010 & 1111 = 1010

(2) | —– 按位或 (和与规则相反)

(3) ~ —-按位取反

~i就是把i变量所有二进制位取反

(4) ^ —- 按位异或

相同位零 不同为1

(5)<< —- 按位左移

i<<3 表示把i的所有二进制位左移3位,右边补零

左移n位相当于乘以2的n次方,前提是数据不能丢失

(6)>> —- 按位右移

i>>3 表示把i的所有二进制位右移3位,左边一般是0,当然也可能补1(算数左移和逻辑左移)

右移相当于除以2的n次方

补充:

原码

  • 也叫 符号-绝对值码
  • 原码 最高位0表示正 1表示负,其余二进制位是该数字的绝对值的二进制位
  • 原码存在加减乘除四种运算,且运算相对复杂,增加CPU的复杂度,零的表示不唯一

你可能感兴趣的:(C语言学习课堂笔记)