字长
字长word size , 决定了 虚拟空间的最大地址
整数表示
对于 (有符号数), 几乎所有的机器, 都使用的是: 补码表示
补码 的意思是: 我给定你一个整数x, 那么, 他在 内存里的 bit位, 是怎样的排布呢? 也就是, 他的机器码 是什么样子
补码 规则如下 比如一个整数, 他有x 个bit位, 他的bit位为: b_0, b_1, b_2, ..., b_(x-1) 规定, b_0为最低位 b_? 为0/1
则, 这x个bit位, 所对应的 (整数)值为:
b
0
+
b
1
?
2
+
b
2
?
4
+
b
3
?
8
+
.
.
.
?
b
(
x
?
1
)
?
2
x
?
1
b_0 + b_1 * 2 + b_2 * 4 + b_3 * 8 + ... - b_(x-1) * {2^{x-1}}
b0?+b1??2+b2??4+b3??8+...?b(?x?1)?2x?1 注意, 前面的 (x-1)个低位, 是直接相加; 而, 最后的 最高位, 是减法!!!
-
当最高位b_(x-1) 为0, 此时, 最后一项的减法不生效; 此时, 低位的(x-1)个bit, 一共有 2^(x-1) 种 机器码, 这些机器码 所对应的 整数, 就为: 该机器码的二进制的所表示的整数 即, 确立了 [0, 1, 2, ..., 2^(x-1) - 1] 这些数 可以发现, 这种情况, 对应的都是( 0 和 正数) -
当最高位b_(x-1) 为1, 此时, 最后一项的 减法 生效 此时, 低位的(x-1)个bit, 一共有 2^(x-1) 种 机器码; 转换规则如上计算出来: 他们所表示的整数是: [-1, -2, ..., -2^(x-1)] 可以发现, 这种情况, 对应的都是( 负数) 对于这种情况, 即(最高位为1 即负数情况 ) 这里有一个口诀, 对于负数-x 的机器码, 将他 -> (取反x个bit全部取反 ) -> (+1)后, 将此时的机器码当成一个x位的二进制, 就可以得到x 值
- 比如, 一个机器码是:
1 0000 , (最高位是1, 表示负数, 可以使用这个"口诀") 1, (取反: 0 1111 ) 2, (+1: 1 0000 该值为: 8), 说明, 该机器码1 0000 所表示的数为: -8 - 比如, 一个机器码是:
1 1111 , (最高位是1, 表示负数, 可以使用这个"口诀") 1, (取反: 0 0000 ) 2, (+1: 0 0001 该值为: 1), 说明, 该机器码1 1111 所表示的数为: -1 这个口诀, 非常重要!!! 他还可以反过来用, (机器码 -> 整数 取反, +1 ) (整数 -> 机器码 -1, 取反 ) 比如: -1 的机器码(补码)是什么呢? 因为是负数, 所以可以使用"口诀"; 假设, 机器码长度为5 (取绝对值: 1 ) -> (二进制: 0 0001 ) -> (-1: 0 0000 ) -> (取反: 1 1111 ); 故, 他的机器码为: 1 1111
移位
左移: (不管是: 有/无 符号 整数), 左移, 都是低位补0
右移:
- 逻辑右移
补0 (无符号: 高位补0) - 算术右移
补符号位 (有符号: 高位补符号位 )
强转
相同长度
T 为 整型类型, T 和 unsigned T1 的强转, 不会改变 机器码 (即内存bit位不会改变), 改变的 只是 (解析方式)
短 -> 长
unsigned -> unsigned 比如, A 是 unsigned类型 , 机器码是: [c, b, a] (a为低位) , 则让A强转到更长的 unsigned类型 , 他会变成: [0, 0, 0, c, b, a] 即, 高位补0
signed -> signed 比如, A 是 signed类型 , 机器码是: [c, b, a] (a为低位) , 则让A强转到更长的 signed类型 , 他会变成: [x, x, x, c, b, a] 且, x = (c == 0 ? 0 : 1) (即, c为0 -> 则均补0; 否则, 均补1)
长 -> 短
unsigned -> unsigned 比如, A 是 unsigned类型 , 机器码是: [e, d, c, b, a] (a为低位) , 则让A强转到更短的 unsigned类型 , 他会变成: [c, b, a] 即, 高位去掉 相当于, 取模
signed -> signed 比如, A 是 signed类型 , 机器码是: [e, d, c, b, a] (a为低位) , 则让A强转到更长的 signed类型 , 他会变成: [c, b, a] 即, 高位去掉 此时, c为符号位
即, 高位到低位的强转, 就是简单的 (将 高位给删除掉)
乘法
整数x * 常数k , k会变成 2次幂形式
比如, -1 * 6 , 6 = 2^2 + 2^1 , 所以: -1 * 6 = -1 * (2^2 + 2^1) = (-1 << 2) + (-1 << 1)
(-1 << 2) == [1, 1111] << 2 == [1, 111, 00] == -4 (-1 << 1) == [1, 1111] << 1 == [1, 1111, 0] == -2
|