排序一个对象的字节有两个通用的规则
通过以下程序可以得到每个字符在内存中对应的存储信息
1 #include<stdio.h>
2 typedef unsigned char *byte_pointer;
3 void show_bytes(byte_pointer start, int len){
4 int i;
5 for(i = 0; i < len; i++){
6 printf(" %.2x", start[i]);
7 }
8 printf("\n");
9 }
10
11 void show_int(int x){
12 show_bytes((byte pointer) &x,sizeof(×));
13 }
布尔运算
左操作 | 正数 | 负数 |
---|---|---|
参数x | [001100011] | [10010101] |
x « 4 | [00110000] | [01010000] |
x « 4(逻辑右移) | [00000110] | [00001001] |
x « 4(算术右移) | [00000110] | [11111001] |
十进制数有正负之分,那么二进制数也有正负之分。带有正、负号的二进制数称为真值,例如 +1010110、-0110101 就是真值。为了方便运算,在计算机中约定: 在有符号数的前面增加 1 位符号位,用 0 表示正号,用 1 表示负号。这种在计算机中用0 和 1 表示正负号的数称为机器数。目前常用的机器数编码方法有原码、反码和补码 3 种。
1 int i = -1;
2 unsigned int b = 0;
3 if(a < b)
4 printf("−1 < 0")
5 else
6 printf("−1 > 0")
1 int uadd_ok(unsigned x, unsigned y){
2 unsigned sum = x + y;
3 return sum >= x; // 溢 出 返 回 0, 没 溢 出 返 回 1
4 }
因为 x 和 y 都是大于 0 的,因此,两者之和大于其中任何一个
与无符号数相加不同的是,有符号数的溢出分为正溢出和负溢出。
我们以乘除 2 的倍数为例进行讨论补码乘除的运算规则:
V = $(-1)^s$ × M × $2^E$
其中最高位 31 位表示符号位 s。当 s=0 时,表示正数;s=1 时则表示负数。从第23 位到 30 位,这 8 个二进制位与阶码的值 E 是相关的。剩余的 23 位与尾数 M 是相关的
对于 64 位双精度浮点数,其二进制位与浮点数的关系如图所示
与单精度浮点数相比,双精度浮点数的符号位也是 1 位。但是阶码字段的长度为 11位,小数字段的长度为 52 位
根据我们 IEEE 浮点数的编码规则,我们将小数点左边的 1 丢弃,由于单精度的小数字段长度为 23,我们还需要在末端增加 10 个零:
IEEE 浮点格式定义了四种不同的舍入方式,分别是:向偶数舍入、向零舍入、向下舍入以及向上舍入
注意事项: