目录
- 0与1的世界
- 1.如何理解32位机器能够同时处理处理32位电路信号?
- 2.如何理解负数的加减法运算
- 3.溢出在运算中如何理解
- 4.计算机种常用的存储单位及转换
- 5.位移运算规则
- 6.有趣的 && 和 &
- 浮点数
- 1.定点小数(为什么会出现浮点数表示?)
0与1的世界
1.如何理解32位机器能够同时处理处理32位电路信号?
设想有8条电路,每条电路有高电平和低电平两种状态,即就有28=256种不同的信号。假设其表示区间为0~255,最大数即28-1。
那么32条电路能够表示最大数为(232-1)=4294967295,即所谓的32位电路信号。
2.如何理解负数的加减法运算
-
正负数表示: 上面的8条电路,最左侧一条表示正负:0-整数,1-负数,不参与数值表示。8条电路表示数值范围 -128~127;
-
二进制整数最终以补码表示: 整数原、反、补码都一样,负数补码为反码加1。
(这样减法运算也可以用加法器实现,使用同一个运算器可减少中间变量的存储开销,降低了CPU内部的设计复杂度,符号位也参与运算)
3.溢出在运算中如何理解
如下图,计算结果需要9条电路表示,用8条电路来表达这个计算结果即溢出。(即在数值运算过程中,超出规定的表示范围)
4.计算机种常用的存储单位及转换
以上示例一条电路线在计算机种被称为1位,即1个bit(简写b)。
8个bit组成一个单位,称一个字节,即1个Byte(简写B)。
1024个Byte(简写为KB);1024个KB(简写为MB);1024个MB(简写为GB)。
5.位移运算规则
补充:
二进制整数最终以补码表示:正数(原、反、补都一样);负数(符号位与原码相同,数值位由原码取反+1)
例如:正数和负数的二进制表示(及十进制转二进制方法)
移动规则:
-
左移右移: 符号位参与移动,除负数向右移动,高位补1之外,其他情况均在空位处补0。
向右移动1位近似表示除以2,但不完全是。十进制奇数转化为二进制后,向右移动时,最右边的1将被直接抹去,即右移对于奇数并非完全相当除以2。
例如111(二进制) = 7(十进制),右移1位:11(二进制) = 3(十进制),这里也解释了除法中的向下取整。
如下图,正数或者负数向左移动的结果可能是正数,也可能是负数。(高位添补规律图示)
-
无符号向右移动 >>>
注意不存在 <<< 无符号向左移动。
向右移动时,正负数高位均补0,正数不断向右移动的最小值是0,而负数不断向右移动的最小值是1。
为何负数不断向右移动最小值是1?(待补充)
6.有趣的 && 和 &
-
按位与(&) 、逻辑与(&&) 和 按位或(|)、逻辑或(||)
区别:&& 有短路功能 ,例如:
/** * 由于&&前边的表达式为false触发短路直接退出,最后结果:a = false ,b = true */ boolean a = true; boolean b = true; boolean c = (a=(1==2)) && (b=(1==2))
/** * 最后结果:a = false ,b = false */ boolean a = true; boolean b = true; boolean c = (a=(1==2)) & (b=(1==2))
同理,按位或(|)对应的逻辑或(||)也有短路的功能
/** * 由于||前边的表达式为true触发短路直接退出,最后结果:e = true ,f = false */ boolean e = false; boolean f = false; boolean g = (e=(1==1)) || (f=(1==1))
/** * 最后结果:e = true ,f = true */ boolean e = false; boolean f = false; boolean g = (e=(1==1)) || (f=(1==1))
注意:逻辑或、逻辑与只能对布尔类型的条件表达式进行运算
-
异或运算 ^
异或运算没有短路功能,其运算:相同为0,不同为1。
例如:1^1=0; 10=1;truetrue=false;…