计算机中一切信息都是0和1
字
是计算机一次处理的最位数, 目前常用有32位和64位就是指的字(Word).
字节
是计算机处理的最小单位, 8位二进制数串.
寻址
, 多字节对象(如32位整数)都被存储为连续的字节序列, 对象地址为所使用字节中最 小的地址.字节顺序
, 多字节对象(如32位整数)需要按照顺序依次存储字节,大头端, Big endian
是 最高有效字节放在低地址位;小头端, Little endian
是低有效字节放在低地址位.
网络字节序
, 网络传输一般使用大头端传输, 使用htons
和ntohs
两个函数, 把数据 在主机和网络格式上相互转换.
计算机只能识别二进制, 一切信息需要转换成二进制才能使用计算机处理或存储或传输,
CPU指令也是使用二进制表示.二进制不可读容易出错, 而十进制与二进制转换又很麻烦 , 所以引入八进制和十六进制表示
每3位二进制数换成一位八进制数, 八进制以
0
开头
01 07 03
001 111 011
每4位二进制数换成一位十六进制数, 十六进制以
0x
开头, 从10开始以A, B, C, D, E, F
表示.
0x1 0x7 0x3 0xA 0xF
0001 0111 0011 1010 1111
二进制, 八进制, 十六进制定义为系数
a
, 与十进制转换需要使用乘除法.将十进制x转换成系数
a
进制, 需要反复地用a除x, 得到一个商q和一个余数r, 也就是
x = q * a + r. 余数就是a的位数, 从低到高, 直到商等于0.
314156 转换成 十六进制:
314156 = 19634 * 16 + 12 (C)
19634 = 1227 * 16 + 2 (2)
1227 = 76 * 16 + 11 (B)
76 = 4 * 16 + 12 (C)
4 = 0 * 16 + 4 (4)
0x4CB2C
将系统
a
进制转成十进制, 需要使用a的幂乘以每个a进制数.
0x7AF 转换成 十进制:
7 * 16^2 + A * 16^1 + F * 16^0
1967
数值运算, 需要把数值转换成二进制, 再通过CPU指令计算.
原码: 数据转换成特定位数的二进制(16位, 32位等), 最高位为符号位, 0代表正数, 1代表
负数, 非符号位为该数字绝对值的二进制表示.反码: 正数与原码一致; 负数为原码按位取反, 符号位不变, 也叫1’s complement(基于1
的补码)补码: 正数与原码一致; 负数为反码 + 1, 也叫2’s complement(基于2的补码
计算机数字运算均是基于补码, 这是因为可以把减法运算变成加法运算;而乘法可以用加法来做
,除法可以转变成减法。
加减法
都是使用加法器, 0 和 0 结果 是0, 1 和 0 结果 是1, 1 和 1结果是0并且进位
乘法
x * y, 计算机中数值都是2^n + 2^n-1 … 2^0, 那么
x * y = x * (2^n + 2^n-1 + 2^0)
= (x * 2^n) + (x * 2^n-1) + (x * 2^0)
2^n 可以看做二进制左移n位, 所以乘法可以使用位移运算和加法运算表示. 乘法还可以直接
转换成加法运算, 5 * 3 = 5 + 5 * 5 = 15
除法
, 可以使用长减法, 如 30 / 12:
1. 30 - 12 = 18
2. 18 - 12 = 6
减了2次, 商等于2 余6. 除法也可以使用位移:
209 / 5 = 1101 0001 / 0000 0101
首先取 209 的最高位 1 (101 0001) 小于 101
左移一位 11 (01 0001) 小于 101
左移一位 110 (1 0001) 大于 101 ,商 1 ,余 1 (1 0001)
左移一位 11 (0001) 小于 101
左移一位 110 (001) 大于 101 ,商 1 ,余 1 (001)
左移一位 10 (01) 小于 101
左移一位 100 (1) 小于 101
左移一位 1001 大于 101 ,商 1 ,余 100
于是结果为 00101001 (41),余数为 100 (4)。
十进制小数转二进制小数: 整数部分, 难除以2取余, 逆序排列; 小数部分, 乘2取整, 顺序
排列.
0.4十进制小数 转 二进制小数:
0.4*2=0.8 0
0.8*2=1.6 1
0.6*2=1.2 1
0.2*2=0.4 0
0.4*2=0.8 0
.
.
.
0.011001100....
IEEE浮点表示, V=(-1)^s * M * 2^E的形式来表示一个数.
符号(sign)
表示数值是正数(s=0)还是负数(s=1)
尾数(significand)
M是一个二进制小数阶码(exponent)
E的作用是对浮点数加权
64位: 1位s, 11位e, 52位m
计算机使用二进制保存字符, 这就涉及到字符的编码, 解码. 编码, 解码必须使用同种规范
不然会显示乱码.
ASCII码 1位字节, 只能表示英文, 数字等, 不能表示汉字. 为了表示汉字所以国家出了自己的 字符集, 以出现的时间来GB2312, GBK, GB18030.
GB2312:
GB18030:
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等
通用字符集(Universal Character Set, UCS), 是由ISO制定的ISO 10646
(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-2 使用两个字节表示代码点, 范围为 U+0000 ~ U+FFFF.
USC-4 使用四个字节表示代码点, 范围为 U+00000000 ~ U+7FFFFFFF, 其中U=00000000 ~
U+0000FFFF和UCS-2是一样的.UTF-8, UTF-16, UTF-32是对USC不同的编码表示.
Unicode编码(十六进制) | UTF-8 字节流(二进制) |
---|---|
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Unicode编码 | UTF-16LE | UTF-16BE | UTF32-LE | UTF32-BE |
0x006C49 | 49 6C | 6C 49 | 49 6C 00 00 | 00 00 6C 49 |
0x020C30 | 30 DC 43 D8 | D8 43 DC 30 | 30 0C 02 00 | 00 02 0C 30 |
UTF编码的BOM:
UTF编码 | Byte Order Mark (BOM)
UTF-8 without BOM | 无
UTF-8 with BOM | EF BB BF
UTF-16LE | FF FE
UTF-16BE | FE FF
UTF-32LE | FF FE 00 00
UTF-32BE | 00 00 FE FF