CSAPP第三章学习笔记
Bits,Bytes,and Integers cont
1.无符号整数基本运算规则:
当两个无符号整数相加超过了该整数所用位数的最大值时,系统会自动将最高位的n进制数字去除,得到原数减去2^w后的结果,称这个现象为溢出
2.补码整数的基本运算规则:
先将有符号数字用无符号形式表示出来,再进行二进制加法,最后再用补码转化结果
3.补码溢出:
分为正溢出和负溢出.
正溢出:两个正有符号数相加因为超出最大值所以被补码表示为负数
负溢出:两个负有符号数相加因为低于最小值所以被补码表示为整数
4.乘除法:
在超出范围后依旧会发生截断,截断后剩下的低位利用补码的形式计算结果。
在做乘法运算时,编译器会理解为进行移位操作,以便节省更多时间。
在十进制中,乘以10意味着原数据小数点向右移动一位,二进制则以乘以2为单位进行向左移动,移动后超出左侧最高位的依旧被舍弃,除法向右移.
当进行乘除运算想要保留符号时,可以采用算数移位,用1填充位(上面的是逻辑移位,用0填充)
5.对数字取负(有符号数):
采用取反加以法,对二进制数整体前后调换取反,在加上1(二进制形式相加)
补充:
Java中任何数都以补码形式表示,<<<表示逻辑右移,<<表示算数右移;
而C中没有明确指出(隐式分配)。
size of ()会自动将对象标识为无符号数。
内存中一些数字的底层表示:
可以用三位十进制数来表示十位二进制数,例如:2^10≈10^3
分段错误:操作系统只允许访问者访问一部分内存,如果尝试访问其他内存,将会报错.
一段内存由多个字块表示,内存本身为一系列字节,假设字的地址为最低地址。
假设:一段32位的字,它的最低位为5个0
此图不太懂,看下面的大小端序可以看懂()
字节在一段字中的存储顺序:
小端序:第一个字节为最小字节
大端序:小端序反过来
举例:对于一个四字节数存放0x1234567
不同系统对于统一串字所打印出的对应指针不同