一、原码、反码、补码
- 补码:
- CPU的减法,通过加法器和补码实现
- 溢出(循环):256-1 与 -1 二进制一样。
负数补码计算方法:数值位(符号位外的后7位),取反+1 //不”+1”的话,减法不能成功地变为加法
- -128 1000,0000 //-128是人为规定的,从-127而来,也是”+1”的原因之一
- -127 1000,0001
- -1 1111,1111
- 0 0000,0000 //-1 + 1 = 1,0000,0000就会溢出了,因为-1 与 256-1 效果一样
- 1 0000,0001
- 127 0111,1111
byte -255[-1, 1]
- 原码10000000,1111111//数值位取反–>
- 反码11111111,0000000–>+1
- 补码1111’1111,0000001
- int -255[-1, -1, -1, 1]
- 原码1000’0000,0000’0000,0000’0000,1111111–>数值位取反
- 反码1111’1111,1111’1111,1111’1111,0000000–>+1
- 补码1111’1111,1111’1111,1111’1111,0000001
二、二进制校验码
- 奇偶校验码-奇校验码 和 偶校验码 的统称.
原编码 | 奇校验 | 偶校验 |
---|---|---|
0000 | 0000 1 | 0000 0 |
0010 | 0010 0 | 0010 1 |
海明校验码-多重奇偶校验检错码
- 可以检测任何位出错,并能纠正1位错误
- 必须满足:pow(2,k)-1 >= n+k //pow(2,k) (代表2的k次方)
CRC即 循环冗余校验码–广泛应用于数据通信领域和磁介质存储系统中.
三、字节序、bit序、有效位
字节序: 一个数据单元(多字节)的字节顺序。不必考虑byte内部bit的细节。
- 大,小:权值大,权值小
- 端:开端,左边是开端,左边是低地址,人的思维从左到右,
- Big-Endian
- 人的习惯。
- 权值最大(高)的字节(MSB)放在低地址(端)。
- 符号位的判定固定为第一个字节,容易判断正负。
- 实例:java,TCP。
- Little-Endian
- 计算机的习惯。
- 权值最小的字节(MSB)放在低地址(端)。
- 强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
- 实例:win7
bit序:一个字节内,bit的顺序。大都是大端序,左大右小,比如TCP中6bits的标志位:
- URG=2^5=32=0x20
- ACK=2^4=16=0x10
- PSH=2^3=8=0x08
- RST=2^2=4=0x04
- SYN=2^1=2=0x02
- FIN=2^0=1=0x01
有效位
- 最低有效位(lsb,least significant bit):
- lsb指一个二进制数字中的第0位(即最低位,最低权重位,权值为2^0)
- LSB(the Least Significant Byte),多字节序列中具有最大权重的字节。
- 最高有效位(msb,Most Significant Byte)
- lsb的反面。
- LSB的反面
Unicode & UTF-8
- Unicode (uniqueness code) 唯一码。是个字符集,是内存中的值
- UTF-8,以字节为单位对Unicode进行编码。
- “汉”的Unicode编码是0x6C49, 在0x0800-0xFFFF之间,使用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx
- 0x6C49对应的二进制:0110 1100 0100 1001, 依次代替3字模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
Unicode编码(十六进制) | UTF-8 字节流(二进制) |
---|---|
000000-00007F | 0xxxxxxx //兼容ASCII的前127位 |
000080-0007FF | 110xxxxx 10xxxxxx //”110”表明:占用2个字节 |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx10xxxxxx10xxxxxx10xxxxxx |
- UTF-16, 以16位无符号整数为单位。略
- UTF-32, 以32位无符号整数为单位。略