计算机系统第二章——位与整数

一.位
为什么是二进制:计算机是由仅具有开关两个状态的逻辑电路组成
二进制的计算模式被十进制简单
具有较强抗干扰性
二进制便于布尔代数运算
二进制:使用一个选中的数R作为底,并用它的幂作为权,这样就形成了用R来表示所有数的形式
二进制就是以2为底,2的幂次来表示的形式
进制转换:十进制转换二进制
每个数除以二,得余数倒序
也可以通过2的幂次拼接
十六进制;从0到f,C语言中,使用0x********来标识十六进制数
char字符型:1个字节
short:短整型:2个字节
int整型:4个字节
long长整型:4个字节
long long长长整型:8个字节
float:单精度浮点型:4个字节
double:双精度浮点型:8个字节
指针:4个字节:32位

位级操作:
布尔代数:与或非
异或:不同为1,相同为0
C语言中有所有位运算操作符:&,|,~,^使用与所有整形数据long int short char unsigned
将参数视为位向量
参数是按位来参与运算

逻辑运算:&&,||,!定义0为假,所有非0值为真,返回值非0即1
移位运算:左移x<<y 将位向量x左移y位
左边多余位均舍弃,右侧用0补齐

右移x>>y
将位向量x右移y位,右边多余位均舍弃
逻辑右移:左边以0补齐
算术右移:左侧用最高位补齐

左移k位就是乘以2^k
右移k位就是除以2^k,但有可能越界了,就截断

基于字节的内存模式
:已知一条地址总线的位数,如何计算其所能表达的地址空间大小
例如:一条地址总线有13根地址线,则它表达的地址空间有2^13
一个内存地址存放的是一个字节
地址指明的是某个字节的存放位置
即某数据第一个字节所在的位置
因此连续存放的两个字之间相差4个地址(32位字长)或者8个地址(64位字长)
字节的存放顺序
一个多字节数据怎样在内存中存放的
小端法:低位字节占据低位地址
举例:4字节变量x的值是0x01234567,
0x100 0x101 0x102 0x103
67 45 23 01
指针表示:类似,比如0xbffff0e8也是用小端法存储
字符串表示:无小端法与大端法区别,因为这是字符数组,每一个字符只占一个字节
由字符的数组表示每一个字符由ASCII码来表示
字符’0’的ASCII码为0x30,数i的ASCII码为0x30+i
字符串必须以一个空字符表示结尾,也就是说最后一个字符为0

二.整数
1.有符号数与无符号数
C数据类型 最小值 最大值
char -128 127(因为我们只能用这8位表示正数和负数,所以我们只能用一半的数来表示负数,剩下的一半表示非负数,因为中间有个0,是非负数)
unsigned char 0 255 (因为char只占一个字节,有8位,所以可以表示2^8-1=255)
short -32768 32767
unsigned short 0 65535(2^16-1)

整数的编码:
无符号数:B2U(X)=
在这里插入图片描述
B:binary U:unsigned意思就是二进制转换为10进制的unsigned

有符号数就用二进制补码来表示:
B2T(X)=
在这里插入图片描述
如果是有符号数转换为10进制就要加上符号位的负权重

(有符号数)二进制补码中,最高位为符号位
0表示非负数,1表示负数

补码的本质:B2T(X)=

用最高位的负权重将数值往数轴负方向迁移

将无符号数中最高位为1的一半用来表示负数
1000如果是无符号数为+8,如果是有符号数,这就是二进制补码,为-8,在取值16的范围内,+8和-8形成了互补
也就是将无符号数2(w-1)到2w-1这一段范围来表示负数-2^(w-1)到-1
2(w-1)到2w-1最高位就为1了,用来表示负数

1010原本表示为无符号数就是23+21=10
如果表示为有符号数就是负数,为-23+21=-6
这两个在16的范围内就是互补,所以1010就是-6的补码表示(也就是有符号数)

补码的取值范围:也就是有符号数的取值范围
-2(w-1)到2(w-1)-1
0到2(w-1)-1对应于无符号数的0到2(w-1)-1
-2(w-1)到0对应于无符号数的2(w-1)到2^w-1

当w=16时
无符号数最大值FF FF 也就是11111111 11111111
二进制补码也就是有符号数最大值就是01111111 11111111也就是7F FF
|TMin|=TMax+1
UMax=2*TMax+1
在C语言中
ULONG_MAX=2^32-1(表示无符号的长整型的最大值)
LONG_MAX=2^(32-1)-1
LONG_MIN=-2^(32-1)

求补码的四种方式
对字长为w的负数x求补码(也就是有符号数的二进制表示)
-6表示为1010
方法2^w-|x|=a,则a(无符号数)的二进制表达即为x的w位补码
-6的原码为1110,首位符号位不变,余下三位取反加1得1010

转换:
有符号数与无符号数的表示
有符号数-6变为T2B
T:有符号数 B:binary
就是将有符号数变成补码表示
然后将补码表示当做无符号数底权公式展开

有符号数负数部分+2^w就是其对应的无符号数

C语言中的整数:
常数:默认为有符号数
或者使用U作为无符号数的后缀
有符号数和无符号数的转换与U2T以及T2U完全一样
特殊情况:如果一个表达式中既有无符号数,又有有符号数,有符号数直接转为无符号数

在32位机器中,int有32位
int x=-1 这是有符号数(用二进制补码表示),为32个1
转化为有符号数就是2^32-1=4294967295

unsigned u=2147483648=2^31转化为二进制就是1+31个0
转化为有符号数为-2^31=-2147483648

有符号数小结:
位模式不变,本质是用最高位为1的数去表示有互补关系的负数
重新解释
当加上或者减去2^w时会有意外情况
表达式中同时存在有符号数和无符号数时,int 默认转换为unsigned

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值