-
整数的表示只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。
-
机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。
-
每台计算机都有一个字长,指明指针数据的标称大小。字长决定的最重要系统参数就是虚拟地址空间的最大大小。
-
指定32位或64位编译:
linux> gcc -m32 prog.c linux> gcc -m64 prog.c
-
指针指向最低的字节地址(如数组指针)。
-
C语言的运算符sizeof可以确定对象使用的字节数。
-
二进制代码很少能在不同机器和操作系统组合之间移植。
-
右移分为逻辑右移和算术右移(涉及符号)。
-
无符号数编码的定义:对向量
\vec{x}=[x_{w-1},x_{w-2},...,x_0]
,B2U_w(\vec{x})=\sum_{i=0}^{w-1}x_i2^i
-
补码编码的定义:对向量
\vec{x}=[x_{w-1},x_{w-2},...,x_0]
,B2T_w(\vec{x})=-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i
-
补码编码具有唯一性,即
B2T_w(\vec{x})
是一个双射函数。 -
反码:
B2O_w(\vec{x})
除了最高位权是-(2^{w-1}-1)
,其他的和补码一致。 -
原码:
B2S_w(\vec{x})=(-1)^{x_{w-1}} ·(\sum_{i=0}^{w-2}x_i2^i)
-
反码=补码+1
-
x>0
,原码和补码一致,-x
的补码需要原码先对x
的原码每一位取负变为反码,然后最后以为加一变为补码。 -
有无符号数之间的转换实际上是在不改变位中信息的情况下用不同的编码阐释,遵循的原则是底层的位表示保持不变。
-
执行一个运算时,如果同时存在有符号数和无符号数,那么C语言会隐式地将有符号数强制类型转换为无符号数。
-
创建无符号常量需要加上后缀
'U'
,如0x1A2B3Cu
。 -
无符号数的扩展:扩展的高位均为0。
-
有符号数的扩展:扩展的高位和原数补码最高位保持一致。(其实就是保证扩展后原数保持不变)
-
无符号数的截断:直接舍弃截断的位。
-
有符号数的截断:截断后重新编码为补码。
-
整数运算的溢出等同于对结果取模。
-
IEEE浮点表示