大多数计算机使用字节作为最小的可寻址的内存单位。
虚拟地址空间,所有虚拟内存的可能地址的集合,它是一个展现给机器级程序的概念性映像(具体见第九章 后补)。
十六进制表示法(hex):一个字节在二进制下的值域是00000000 ~ 11111111,在十进制下的值域是0 ~ 255,在十六进制下的值域是00 ~ FF。【基本知识点:进制之间的转换】
对于一个字长为w位的机器而言,虚拟地址的范围为0 ~ 2w-1。
我们将程序称为32位或64位,区别在于该程序是怎么编译的而不是其运行的机器类型。
数据类型int32_t(4字节)和int64_t(8字节)的引入,是为了固定数据大小。如果大小不同是会引发问题的,譬如在假设一个声明为int型对象来存储一个指针,在32位机上可以但在64位机上会出问题,因为64位机需要的是范围为16EB的指针。
逻辑右移在左边补0,算术右移在左边补有效位。
可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位。计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息。
无符号表示中的Umax和补码表示的-1有相同的位模式,1+Umax=2w
当执行一个运算时,如果它的一个运算数是有符号的,另一个是无符号的,那么c语言会隐式地将有符号数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。这对于像 < 和 > 这样的关系运算符来说,它会导致非直观的结果。e.g.比较式-1<0u,运算会被转成4294967295<0u,答案是0。
零扩展:将无符号数转换成为一个更大的数据类型时,在开头添加0
符号扩展:将补码数字转换成为一个更大的数据类型,在表示中添加最高有效位的值
执行c程序时,不会将溢出作为错误而发信号,但可以用s
执行位级补码非的第一种方法是对每一位取反,再对结果加1。在C语言中,对于任意整数值x,计算表达式-x 和 ~x+1得到的结果完全相同。
左移一个数值等价于执行一个与2的幂相乘的无符号乘法。
对于某个常数K的表达式 x*K 生成代码,编译器会将K的二进制表示为一组0和1交替的序列(比如14可以写成[(0…0)(111)(0)]),考虑一组从位置n到m的连续的1(对于14来说n=3,m=1)我们可以用下面这两种方法来计算这些位对乘积的影响:
n=m时,选择A,否则选择B。
补码的除法:对于x >= 0 ,变量x的符号位为0,所以效果和逻辑右移是一样的。对于负数,会按照向下舍入(例如-771.25 会舍入到 -772)这个舍入可以依靠在移位之前偏置这个值来修正变成向上舍入,即把下面的移位式变成 (x+(1<