越来越觉得有些基础知识太重要了,最近在疯狂的补回来,有的以前学了,现在淡忘了,有的当初学的就不好。
没有关系,最近都开始补回来。应验了那句话“出来混,迟早要还的。”
下面是我总结的一些基础必备,如果大家觉得还需要补充哪些知识,还请提出来,我们一起补习。
比特
(比特,也称位)是最小单位,0或1。
8个bit的宽度(即8条线路),可以表示28=256个不同的状态(0000 0000-1111 1111)。
通常k个bit的组合可以表达2k个不同状态,每个状态分别是k个0和1的bit序列组合。我们称该0和1的序列为编码,每个编码对应一个特定的值或状态。
5表示为0000 0101
字节
字节,B,
一个字母一个字节,一个数字一个字节,一个汉字两个字节
1Byte=8bit
千字节
千字节
1KB=210Byte=1024B
兆字节
兆字节
1MB=210KB
千兆字节
千兆字节
1GB=210MB
吉字节
吉字节
1TB=210GB
所有位都用来表示一个数,没有用来表示负数的位,所以只能表示正数。
有k个bit则可以表示2k个无符号整数(从0到2k-1)。5-bit可以表示的数值范围是0-31.
左边第一位是符号位,0代表正数,1代表负数。
原码(true form)是一种中对数字的定点表示方法。原码表示法在数值前面
增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011
原码就是绝对值的二进制,最前面加上一个符号位表示正负。
与相同。
【例1】+9的补码是00001001。(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。)
负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。
同一个数字在不同的补码表示形式里头,是不同的。比方说-15的补码,在8位2进制里头是 11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认了把一个数转换 成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。
【例2】求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:-7的原码(10000111)→按位取反(11111000)(负数符号位不变)→加1(11111001)
所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
(2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
再举一个例子:求-64的补码
+64:01000000
11000000
【例4】-65的补码是10111111
若直接将10111111转换成十进制,发现结果并不是-65,而是191。
事实上,在计算机内,如果是一个数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。
若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。
如:二进制值:10111111(-65的补码)
各位取反:01000000
加1:01000001(+65的补码)
忽略符号位,其他位取反,然后加1,算出除去符号位的值,加上负号。
先求绝对值的二进制,然后取反,然后加1,然后第一位置1作为符号位,表示当前码为负数。
在二进制正数前面加任意多的0不会改变其值,在二进制负数前面加任意多的1(符号位扩展Sign Extension)不会改变其值。我们称这样的操作为“符号扩展”。符号扩展主要用在另个不同长度的二进制数相加的场合。
相加溢出表现为高位被隐藏,例如千年虫问题。
有符号整数相加可能会导致最高位的符号位发生变化。
两个正数相加的结果必然是正数,如果是负数,说明溢出了。两个负数相加的结果必然是负数,如果是正数,说明溢出了。
事实上,只有在两种同符号运算情况下,才会发生溢出。一个正数和一个负数相加,永远不可能溢出。
非0为true,0为false。
二元运算符,只有两个操作数同为1,结果为1,否则结果为0.
二元运算符,只要一个操作数为1,结果为1,否则结果为0.
一元运算符,取反操作。
二元运算符,操作数相反,结果为1,否则结果为0.
码
8-bit编码方式叫做ASCII码。
与double的范围和精度
范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) | 8bits(指数位) | 23bits(尾数位) |
double:
1bit(符号位) | 11bits(指数位) | 52bits(尾数位) |
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。