- 无符号编码基于传统的二进制表示法,表示大于或者等于零的数字
- 补码编码是表示有符号整数最常见的方式
- 浮点数编码是表示实数的科学记数法的以二为基数的版本
整数的计算机运算满足人们熟知的真正整数运算的规律
由于表示的进度有限,浮点运算不可结合(整数范围有限但精确,浮点数范围较大但是近似)
信息存储
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器
存储器的每个字节都有一个唯一的数字来标识,成为它的地址
所有可能的地址集合称为虚拟地址空间
程序对象:程序数据,指令和控制信息
十六进制
在C语言中,以0x或0X开头的数字常量被认为是16进制的值。字符’A’~’F’既可以是大写也可以是小写,甚至是大小写混合。
字
每台计算机都有一个字长,指明整数和指针数据的标称大小。
因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。
数据大小
C语言支持整数和浮点数的多种数据格式
char
存储单个字符,也可以用来存储整数值。
int
,short
,long long
,短整数分配两个字节,不加限定的int分配四个字节,长整数使用机器的全字长。
指针使用机器的全字长
单精度(float)和双精度(double),格式分别使用4字节和8字节
C申明 | 32位机器 | 64位机器 |
---|---|---|
char | 1 | 1 |
short int | 2 | 2 |
int | 4 | 4 |
long int | 4 | 8 |
long long int | 8 | 8 |
char * | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
可移植的一个方面就是使程序对不同数据类型的确切大小不敏感。
寻址和字节顺序
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
这个是通用的原则,不管是大端还是小端都是这样的。
大端就是对象的地址处是最高字节然后顺序存储,小端就是对象的地址处是最小字节然后顺序存储。
不管是大端还是小端,对象的地址都是所有字节的地址中最小的地址。
字节顺序在大部分的时候是不可见的,对于应用程序员来说。但有3类情况变得可见。
- 网络传送,现在的解决方法是网络传送时是网络传送的标准,大端和小端都要在传送时变成网络标准,接受时再变回去。
- 阅读表示整数数据的字节序列时
- 当编写规避正常的类型系统程序时,类型强制转换,类型转化就可以看作是地址不变,但取的字节书目变了。当然大端和小端就会显示出差别。大多数应用编程都强烈不推荐这种编码技巧,但是它们对系统级编程来说非常有用甚至是必需的。
sizeof(T)返回存储 一个类型为T的对象所需要的字节数。sizeof是运算符,比如+。
表示字符串
c语言中字符串被编码为一个以null字符结尾的字符数组,null字符在ASCII中是0,也就是说所有的c语言字符串最后一个字节都是0。
Unicode联合会的Unicode标准目前字库包括十万个字符。
基本编码,也成为Unicode的“统一字符集“使用32位来表示字符,
UTF-8表示将每个字符编码为一个字节序列,所有的ASCII字节序列用ASCII码表示和UTF-8表示一样。
Java使用Unicode来表示字符串,也就是一个字符4字节,浪费。
表示代码
不同的机器类型使用不同的且不兼容的指令和编码方式,二进制代码是不兼容的,即使一样的程序,编译出来的机器级代码也是不一样的。
二进制代码很少能在不同机器和操作系统组合之间移植。
所以说,不可移植在于不同的机器硬件和操作系统的组合。
布尔代数简介
布尔代数有很多有用的结论,记住就可以了,最好的一个是a^(b^a)=b。
位向量一个很有用的应用就是表示有限集合。
c语言中的位级运算
既然是位级运算,那就是对位的,不论操作数是什么类型,位级运算符不关心,就是对位的。位级运算的一个常见应用就是实现掩码运算
掩码是一个位模式,表示从一个字中选出的位的集合。
c语言中的逻辑运算
c语言中的移位操作中,向左移位是很简单的,丢弃高位的,低位补0,始终如此。
但向右移位有两种,一种是逻辑移位,一种是算术移位,逻辑移位高端补0,算术移位高端是1补1,是0补0。
存在两种右移,归根结底是机器提供了这两种形式。
c语言标准没有明确定义使用那种右移。但有其他的限制:无符号数据必须逻辑右移,有符号数据则不能确定。
但实际上,总存在典型值的,那就是几乎所有的编译器/机器组合对有符号数据都执行算术右移。
c语言标准也没有定义当移位(右移或者左移)的位数大于数据位数时该怎么做,典型值是取mod。比如32就变成了0,34变成了2。
整数表示
用位来编码整数的两种不同的方式:一种只能表示非负数,而另一种能够表示负数、0和正数。
这是两种最常用的,但当然还有其他的用位编码整数的方式,不说,不代表不存在,也不代表没人用,重点是这里,目前,最多的使用的编码整数的方式是这两种。
而且,这两种的数学属性和机器级实现方面密切关联。
整型数据类型
32位机和64位机上的c语言整数数据类型的典型字节数除了long之外都是一致的,char1,short2,int4,longlong8。
而long在32位是4字节,在64位是8字节。注意:这里是典型字节数。