信息的表示和处理(一)
- 大多数计算机使用8位的块(也就是一个字节byte),由此可以看到32位(4个字节)系统和64位(8个字节)系统的区别。32位系统在于cpu可以同时处理4个字节(32位)的数据,那么64位系统cpu可以同时处理8个字节(64位)的数据。
- 一个字节(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