二进制单位
- 二进制(binary):0,1,满2进1.以0b或0B开头。
- 十进制(decimal):0-9,满10进1。
- 八进制(octal):0-7,满8进1.以数字0开头表示。
- 十六进制(hex):0-9及A-F,满16进1.以0x或0X开头表示。此处的A-F不区分大小写。
bit,中文译为位,是指0或者1两个状态,是二进制中是最小的单位。
byte,即字节,有8个位。
当用16进制表示的时候,0xAB是一个byte,但是看起来是有两个数字。其中一个数字表示4bit。一位叫bit,8位叫byte,猜猜4位叫什么?答案,是nibble。
为什么呢?16进制最大单数值是F即15,而用二进制表示得需4位即1111,即1byte=8bit=20X
也有解释:1btye是8bit,最大值为0B11111111即255,此时需要两位16进制才能表示,所以1byte相当于两个16进制位,即1byte=8bit=20X
比如我们说15,都会预设是多少字节长度的。
如果是两个字节长度的15,应该写作0x000F,
如果一个字节的15就会是0x0F。
有人会说,这有什么区别?前面不都是0嘛。
区别是对于两个字节长度的15,它的最高位是第16位(从右边数)。而对于一个字节的15,它的最高位是第8位.决定相加会不会溢出。
比如一个字节的255 + 1就会溢出,它的结果是0x00,而两个字节长度的255+1等于256,即0x0100,不会溢出。
三码
- 原码:未经更改的码。它由最左边的符号位和二进制数构成。
- 反码:正数不变,负数取反的码。正数的反码和原码一样,负数的反码需要保留最左边符号位,然后将原码数值位按照每位取反得到。
- 补码:正数不变,负数取反补一的码。正数的补码和原码一样,负数的补码需要保留最左边符号位,然后将原码数值位按照每位取反再加一;是计算机数据存储的最常用的方式。
总结
- 三码都是二进制表达。
- 三码第一位是符号位,1 表示负数,0 表示正数,其余位是数值位。
- 正数的三码都一样。
- 负数的反码是在原码基础上对非符号位取反,即负数反码=符号位+原码数值位取反。
- 负数的补码是在反码基础上加一,即负数补码=反码+1。
- 负数补码转原码是在补码基础上减一,然后对非符号位取反,即负数原码=(补码-1)&&数值位取反。
- 计算机数据存储都是补码。
- 各自优缺点:
原码最好理解,但是加减法不够方便,还有两个零
反码稍微困难一些,解决了加减法的问题,但还是有个零
补码理解困难,其他就没什么缺点了