1.整数的计算机运算满足真正整数运算的结合律和交换律,因为计算机对整数的表示是严格精确的,但是浮点数由于表示的精度有限,浮点运算是不可结合的。如
(3.14+1e20)-1e20 //值是0
3.14+(1e20-1e20) //值是3.14
2.机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一 的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。
3.C编译器把每个指针和类型信息联系起来,根据指针值的类型,生成不同的机器级代码来访问存储在指针所指向位置处的值。尽管C编译器维护着这个类型信息,但实际生成的机器级程序并不包含关于数据类型的信息。
4.我们将程序称为"32位程序"或"64位程序"时,区别在于该程序是如何编译的,而不是其运行的机器类型
5.大端和小端
大端法:最高有效字节在最前面的方式
小端法:最低有效字节在最前面的方式
6.字节顺序的影响
(1)不同类型的机器之间通过网络传送二进制数据时
(2)当检查机器级程序,阅读表示整数数据的字节序列时
(3)当编写规避正常的类型系统的程序时,如强制类型转换或联合
7.不用移动元素来交换它们的值(智力游戏)
8.移位运算:几乎所有的编译器/机器组合都对有符号数使用算数移位,对无符号数,右移必须是逻辑的。
Java中明确规定,表达式 x>>k 会将x算术右移k个位置,而 x>>>k 会对x做逻辑右移
在许多机器上,当移动一个w位的值时,移位指令只考虑位移量的低log2w 位,实际上位移量是通过计算 k mod w 得到的
9.C/C++ 都支持有符号(默认)和无符号数,Java只支持有符号数
10.无符号数编码、补码编码
11.C语言中有符号数和无符号数强制类型转换的结果保持位值不变,只是改变了解释这些位的方式
补码转换为无符号数
无符号数转换为补码
当用printf输出数值时,分别用指示符%d %u %x 以有符号十进制、无符号十进制和十六进制格式输出一个数字
C语言执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号参数
-1 < 0U //假
2147483647U > -2147483647-1 //假
2147483647 > (int)2147483648U //真
C标准规定:从short强转为unsigned类型时,先改变大小再完成从有符号数到无符号数的转换。
12.截断数字
13.整数运算
无符号数加法
补码加法
14.IEEE浮点表示