信息的表示和处理
信息存储
二进制表示法、十六进制表示法
十六进制下每个数位上的数字可单独展开为4个二进制的数,从而快速转换成二进制数字
字数据大小
位/比特——>字节——>字
每台计算机都有一个字长,指明指针数据的标称大小,字长决定的最重要的系统参数就是虚拟地址空间最大大小,对于字长32位机器来说,虚拟地址空间最大大小为 2^32(0–2^32-1)byte,也就是4GB。(字长32位,最多对应2^32个地址,计算机存储数据的最小可寻址内存单位是字节,内存(虚拟内存)中每个字节都有唯一的数字来标识-地址,也就是说1个地址对应空间大小为1字节)
关于char,C的数据类型char表示一个单独的字节,尽管char由于它可以存储文本串中的单个字符而得名,但它也能用来存储整数值。
寻址和字节数据
多字节对象被存储为连续的字节序列,对象的地址就是所用字节中最小的地址(开头的地址),排列对象内容有大端法和小端法两种方法。
大多数intel兼容机型一般采用小端法存储,比如 int num=0x01234567,要用四个字节存储,假设67放在地址0x100处,那么45->0x101,23->0x102,01->0x103。大端法存储反过来。
运算
布尔代数 非 ~ , 且 & , 或 | , 异或 ^ 。C语言支持按位进行布尔运算也就是位级运算。
逻辑运算 C语言单独提供逻辑运算符号 || , && , !,默认非零的参数表示true,0表示false。
移位运算 左移 右移,右移又分为逻辑右移和算术右移。有符号数一般使用算术右移,无符号数必须使用逻辑右移。
整数表示
无符号整数表示
无符号整数不包括负数,正常二进制编码表示即可
有符号整数表示
一般有反码 原码 补码三种表示方法,补码表示最常见。原码一般用来表示浮点数。
补码表示,最高位(w位)的权重为-2^w,而不是正的,其他位的权重不变。
强制转换
将有符号整数和无符号整数强制互相转换时,底层源码也就是位模式不变,只是解释的方式变了。
对于C来说,如果一个运算数是有符号的而另外一个是无符号的,那么C会隐式将有符号参数转换为无符号参数。 除非特别指明 比如 unsigned int 或者 0x123u (末尾的u表示无符号,这是个无符号常量),否则大多数整数数字默认有符号。
下面是对于32位机器上最大int类型整数和最小int类型整数的写法(比较奇怪
1 |
整数的扩展和截断
书上的内容易于理解,不在赘述。
整数运算
我的理解,本质都是正常运算(十进制正常运算)后用二进制编码表示,溢出的位进行截断处理
唯一值得一提的是
- 两个相同的位级编码,分别经过无符号乘法和补码乘法(有符号)后,不论是否溢出进行截断处理后,得到结果的位级编码仍然一样。这就是 无符号和补码乘法的位级等价性。
- 乘以2的n次幂用左移n位实现,除以2的n次幂,无符号数逻辑右移n位实现,有符号数算术右移n位实现。
浮点数
在学习数值分析中了解的很深入了,在阅读时略过了这部分内容。