Your Site Title

Compute data

计算机中一切信息都是0和1

字与字节顺序

是计算机一次处理的最位数, 目前常用有32位和64位就是指的字(Word).
字节是计算机处理的最小单位, 8位二进制数串.
寻址, 多字节对象(如32位整数)都被存储为连续的字节序列, 对象地址为所使用字节中最 小的地址. 字节顺序, 多字节对象(如32位整数)需要按照顺序依次存储字节, 大头端, Big endian是 最高有效字节放在低地址位; 小头端, Little endian是低有效字节放在低地址位.

网络字节序, 网络传输一般使用大头端传输, 使用htonsntohs两个函数, 把数据 在主机和网络格式上相互转换.

数值

二进制, 八进制, 十进制, 十六进制

计算机只能识别二进制, 一切信息需要转换成二进制才能使用计算机处理或存储或传输,
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的作用是对浮点数加权

字符编码

计算机使用二进制保存字符, 这就涉及到字符的编码, 解码. 编码, 解码必须使用同种规范
不然会显示乱码.

GB2312, GBK, GB18030

ASCII码 1位字节, 只能表示英文, 数字等, 不能表示汉字. 为了表示汉字所以国家出了自己的 字符集, 以出现的时间来GB2312, GBK, GB18030.

Unicode, Utf-8, utf-16, utf-32

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不同的编码表示.

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