越来越觉得有些基础知识太重要了,最近在疯狂的补回来,有的以前学了,现在淡忘了,有的当初学的就不好。

没有关系,最近都开始补回来。应验了那句话“出来混,迟早要还的。”

下面是我总结的一些基础必备,如果大家觉得还需要补充哪些知识,还请提出来,我们一起补习。

 

 

 

比特

(比特,也称位)是最小单位,01

8bit的宽度(即8条线路),可以表示28=256个不同的状态(0000 0000-1111 1111)。

通常kbit的组合可以表达2k个不同状态,每个状态分别是k01bit序列组合。我们称该01的序列为编码,每个编码对应一个特定的值或状态。

5表示为0000 0101

 

字节

字节,B

一个字母一个字节,一个数字一个字节,一个汉字两个字节

1Byte=8bit

千字节

千字节

1KB=210Byte=1024B

兆字节

兆字节

1MB=210KB

千兆字节

千兆字节

1GB=210MB

 

吉字节

吉字节

1TB=210GB

 

 

所有位都用来表示一个数,没有用来表示负数的位,所以只能表示正数。

kbit则可以表示2k个无符号整数(从02k-1)。5-bit可以表示的数值范围是0-31.

 

左边第一位是符号位,0代表正数,1代表负数。

原码(true form)是一种中对数字的定点表示方法。原码表示法在数值前面

 

增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为10有两种表示:+0-0),其余位表示数值的大小。

简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011-11的原码就是10001011

原码就是绝对值的二进制,最前面加上一个符号位表示正负。

 

  与相同。

【例1+9的补码是00001001(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有162进制补码表示形式,以及322进制补码表示形式等。)

  负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1

  同一个数字在不同的补码表示形式里头,是不同的。比方说-15的补码,在82进制里头是 11110001,然而在162进制补码表示的情况下,就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认了把一个数转换 成82进制的补码形式,每一种补码表示形式都只能表示有限的数字。

  【例2】求-7的补码。

  因为给定数是负数,则符号位为“1”

  后七位:-7的原码(10000111按位取反(11111000)(负数符号位不变)111111001

  所以-7的补码是11111001

  已知一个数的补码,求原码的操作分两种情况:

  (1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

  (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

  再举一个例子:求-64的补码

  +6401000000

11000000

 

  【例4-65的补码是10111111

  若直接将10111111转换成十进制,发现结果并不是-65,而是191

  事实上,在计算机内,如果是一个数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。

  若要得到一个负二进制数的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。

  如:二进制值:10111111-65的补码)

  各位取反:01000000

101000001+65的补码)

 

 

 

忽略符号位,其他位取反,然后加1,算出除去符号位的值,加上负号。

先求绝对值的二进制,然后取反,然后加1,然后第一位置1作为符号位,表示当前码为负数。

 

在二进制正数前面加任意多的0不会改变其值,在二进制负数前面加任意多的1(符号位扩展Sign Extension)不会改变其值。我们称这样的操作为“符号扩展”。符号扩展主要用在另个不同长度的二进制数相加的场合。

 

相加溢出表现为高位被隐藏,例如千年虫问题。

 

有符号整数相加可能会导致最高位的符号位发生变化。

两个正数相加的结果必然是正数,如果是负数,说明溢出了。两个负数相加的结果必然是负数,如果是正数,说明溢出了。

事实上,只有在两种同符号运算情况下,才会发生溢出。一个正数和一个负数相加,永远不可能溢出。

 

0true0false

二元运算符,只有两个操作数同为1,结果为1,否则结果为0.

二元运算符,只要一个操作数为1,结果为1,否则结果为0.

一元运算符,取反操作。

二元运算符,操作数相反,结果为1,否则结果为0.

 

8-bit编码方式叫做ASCII码。

 

double的范围和精度

范围

floatdouble的范围是由指数的位数来决定的。

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+38double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308

精度

floatdouble的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

float2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。