深入理解计算机系统笔记之第二章(一)

信息的表示和处理(一)

  1. 大多数计算机使用8位的块(也就是一个字节byte),由此可以看到32位(4个字节)系统和64位(8个字节)系统的区别。32位系统在于cpu可以同时处理4个字节(32位)的数据,那么64位系统cpu可以同时处理8个字节(64位)的数据。
  2. 一个字节(byte)由8位组成,值域 00000000(2)~11111111(2) == 0(10)~255(10) == 00(16)~FF(16)。正是因为十进制与位模式的互相转化很麻烦,而二进制的四位可表示为十六进制的一位,所以用采用十六进制来转换二进制。
十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F
二进制 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

举例:0x173A4C(16) => 0001 0111 0011 1010 0100 1100(2)

​ 1 7 3 A 4 C

​ 11 1100 1010 1101 1011 0011(2) => 3 C A D B 3(16)

3.对于一个字长为w位的机器而言,虚拟地址的范围为0~2w-1,程序最多访问2w个字节

有符号 无符号 32位 64位
char unsigned char 1 1
short unsigned short 2 2
int unsigned 4 4
long unsigned long 4 8
int32_t uint32_t 4 4
int64_t uint64_t 8 8
char* 4 8
float 4 4
double 8 8

4.假设变量x的类型为int, 位于地址0x100 ,16进制的值为0x01234567 (0被叫做高位字节,7被叫做低位字节)

地址范围0x100~0x103字节顺序机器不同类型:

0x100 0x101 0x102 0x103
大端法 01 23 45 67
小端法 67 45 23 01

5.布尔代数

非运算1100 => 0011

与运算&: 0110 & 1100 => 0100

或预算|:0110 | 1100 => 1110

异或运算 ^ : 0110 ^ 1100 => 1010

&&(逻辑运算符) 与 &(位级运算符) 的区别:若对于第一个参数求值,就能确定表达式结果,那么逻辑运算符不会对第二个参数求值。

if(j2 & i++) 和 if(j2 && i++) 分别printf("%d\n",i) 结果可能不一样

6.移位运算

x 01100011 10010101
x<<4 00110000 01010000
x>>4(逻辑右移) 00000110 00001001
x>>4(算术右移) 00000110 11111001

几乎所有编译器/机器:有符号->算术右移 无符号->必须逻辑右移

java:x>>k 算术右移 x>>>k 逻辑右移

7.64位系统下:

char -128 127
unsigned char 0 255
short -32768 32767
unsigned short 0 65535
int -2147483648 2147483647
unsigned 0 42亿

|TMin| = |TMax| + 1

UMaxw = 2w-1

TMinw = -2(w-1) TMaxw = 2(w-1)-1

9.强制类型转换的结果保持位置不变,只是改变解释这些位的方式。

如:T2U32(-1) = 4294967295 U2T32(4294967295) = -1

猜你喜欢

转载自blog.csdn.net/weixin_42036647/article/details/83032600