1. 字符
2. 整型数字
3. 浮点型数字
4. 图片,声音,视频
1. 字符
编码主要有输入码、机内码、字形码三种.输入码指的是键盘等外部设备输入内存时的编码,机内码指的是在内存/硬盘中的编码.字形码则是对应到显示器显示的字符点阵.
我们主要讨论机内码.
主要是四种 ascii gbk unicode utf-8
ascii 则是最早的编码,只针对西文和控制符.7Bit 后来扩展到了8位.
gbk 由于ascii不能存储中文,因此我国制定了中文标准,两个字节表示,之前的ascii则低字节最高位为0(Windows上就是默认gbk编码)
unicode 由于全世界人民都用电脑,都要添加字符,不够用.所以用unicode(2B)来同一规范.Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储
UTF-8 如果全是英文则太浪费空间,于是又有了UTF-8的编码方式(注意,这个只是unicode的一种实现方式本质) 汉字一般3字节,用了最小前缀编码方式
ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件
程序中的问题:
1. char 单字节保存ascii wchar_t 两个字节
#define LPSTR char* #define LPCSTR const char* #define LPTSTR TCHAR* #define LPCTSTR const TCHAR* #define LPWSTR wchar_t* #define LPCWSTR const wchar_t*
st,T表示TCHAR,W表示wchar_t。最后说一下TCHAR
#ifdef _UNICODE #define TCHAR wchar_t #else #define TCHAR char #endif
2. 若以文本形式打开文件,则读出的\n字符因操作系统不同而不同.Windows中为13 10 Linux为10.还有就是SUB这个文件终结符
2.整型数字
分为有符号,无符号两种. 考虑到运算与逻辑电路的设计,有符号数用补码存放,因为数据存放是定长的所以运算都是(a calc b)%2^n ,那么我们发现若将一个数减小 eg:a->b(b<a)
可以考虑变成 b+2^n 则c=b+2^n-a
浮点数
IEEE754 标准. 数字分为符号位,尾数位(符号位单独列出,因此用原码表示很方便),阶码位.(移码表示)
eg:float 32位, 1位符号位,23位 尾数,8位阶码.
对于浮点数,阶码的作用是比较大小,对码,因此不涉及运算反而要求
1、比较大小方便,2、特殊值(0和max)被检验比较容易
定义中阶码的范围为-127~128.此时移码定义为127.则横跨了0~255的数域.
如果指数是0并且尾数的小数部分是0,这个数±0(和符号位相关)
如果指数 = 2^{e} - 1并且尾数的小数部分是0,这个数是±∞(同样和符号位相关)
如果指数 = 2^{e} - 1并且尾数的小数部分非0,这个数表示为不是一个数(NaN)。
待续.................