二进制与字节
1.二进制
1.1概念
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
1.2 为什么计算机要采用二进制?
首先,二进位计数制仅用两个数码。0和1,所以,任何具有二个不同稳定状态的元件都可用来表示数的某一位。而在实际上具有两种明显稳定状态的元件很多。例如,氖灯的“亮”和“熄” ;开关的“开” 和 “关”;电压的“高” 和“低”、“正”和 “负”;纸带上的“有孔”和“无孔”;电路中的“有信号” 和 “无信号”; 磁性材料的南极和北极等等,不胜枚举。 利用这些截然不同的状态来代表数字,是很容易实现的。不仅如此,更重要的是两种截然不同的状态不单有量上的差别,而且是有质上的不同。这样就能大大提高机器的抗干扰能力,提高可靠性。而要找出一个能表示多于二种状态而且简单可靠的器件,就困难得多了。
其次,二进位计数制的四则运算规则十分简单。而且四则运算最后都可归结为加法运算和移位,这样,电子计算机中的运算器线路也变得十分简单了。不仅如此,线路简化了,速度也就可以提高。这也是十进位计数制所不能相比的。
第三,在电子计算机中采用二进制表示数可以节省设备。可 以从理论上证明,用三进位制最省设备,其次就是二进位制。但由于二进位制有包括三进位制在内的其他进位制所没有的优点,所以大多数电子计算机还是采用二进制。此外,由于二进制中只用二个符号 “ 0” 和“1”,因而可用布尔代数来分析和综合机器中的逻辑线路。 这为设计电子计算机线路提供了一个很有用的工具。
第四,二进制的符号“1”和“0”恰好与逻辑运算中的“对”(true)与“错”(false)对应,便于计算机进行逻辑运算。
1.3二进制计数
1.3.1进制表示
在基数
b
b
b 的位置记数系统(其中
b
b
b 是一个正自然数,叫做基数),
b
b
b 个基本符号(或者叫数字)对应于包括
0
0
0 的最小
b
b
b 个自然数。 要产生其他的数,符号在数中的位置要被用到。最后一位的符号用它本身的值,向左一位其值乘以
b
b
b 。一般来讲,若
b
b
b 是基底,若有n位整数,用数字
a
0
a
1
a
2
.
.
.
a
n
−
1
a_0a_1a_2...a_{n-1}
a0a1a2...an−1表示它的系数,有m位小数,用数字
c
1
c
2
.
.
.
c
m
c_1c_2...c_m
c1c2...cm表示它的加权系数,则我们在
b
b
b 进制系统中的表示,如下形式
(
a
n
−
1
a
n
−
2
.
.
.
a
1
a
0
c
1
c
2
.
.
.
c
m
)
b
=
∑
k
=
0
n
a
k
b
k
+
∑
k
=
1
m
c
k
b
−
k
(a_{n-1}a_{n-2}...a_1a_0c_1c_2...c_m)_b=\displaystyle\sum_{k=0}^na_kb^k + \displaystyle\sum_{k=1}^m c_kb^{-k}
(an−1an−2...a1a0c1c2...cm)b=k=0∑nakbk+k=1∑mckb−k
其中数 b k b^k bk和 b − k b^{-k} b−k是相应数字的比重。
1.3.2二进制表示
二进制数据也是采用位置计数法,其位权是以2为底的幂。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为
(
a
n
−
1
a
n
−
2
.
.
.
a
1
a
0
a
−
1
a
−
2
.
.
.
a
−
m
)
2
=
a
n
−
1
×
2
n
−
1
+
a
n
−
2
×
2
n
−
1
+
…
+
a
1
×
2
1
+
a
0
×
2
0
+
a
−
1
×
2
−
1
+
a
−
2
×
2
−
2
+
…
+
a
−
m
×
2
−
m
(a_{n-1}a_{n-2}...a_1a_0a_{-1}a_{-2}...a_{-m})_2=a_{n-1} × 2^{n-1} + a_{n-2} × 2^{n-1} + \dotso +a_1× 2^1 + a_0× 2^0 + a_{-1}× 2^{-1} + a_{-2}× 2^{-2} + \dotso + a_{-m}× 2^{-m}
(an−1an−2...a1a0a−1a−2...a−m)2=an−1×2n−1+an−2×2n−1+…+a1×21+a0×20+a−1×2−1+a−2×2−2+…+a−m×2−m
例:将二进制数据111.01写成加权系数的形式。
(
111.01
)
2
=
1
×
2
2
+
1
×
2
1
+
1
×
2
0
+
0
×
2
−
1
+
1
×
2
−
2
\left(111.01\right)_2 = 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0} +0 × 2^{-1} + 1 × 2^{-2}
(111.01)2=1×22+1×21+1×20+0×2−1+1×2−2
1.4 运算
1.4.1 加法
二进制加法有四种情况: 0+0=0,0+1=1,1+0=1,1+1=10(0 进位为1)。
例:
1.4.2 减法
二进制减法有四种情况:0-0=0,1-0=1,1-1=0,10-1=1。
例:
1.4.3 乘法
二进制乘法有四种情况: 0×0=0,1×0=0,0×1=0,1×1=1。
例:
1.4.4 除法
二进制除法有两种情况(除数只能为1):0÷1=0,1÷1=1。
例:
1.5 负数的二进制
1.5.1 十进制变二进制:原码–反码–加一(补码);
以8位-5为例
5
的二进制
00000101
取反
11111010
加一
11111011
得到
−
5
11111011
\def\arraystretch{1.5} \begin{array}{c} 5的二进制 &00000101\\ \hline 取反 &11111010 \\ \hline 加一 &11111011\\ \hline 得到-5 & 11111011 \end{array}
5的二进制取反加一得到−500000101111110101111101111111011
1.5.1 二进制变十进制:减一–反码–原码
以8位-5为例
−
5
的二进制
11111011
减一
11111010
取反得到
5
00000101
\def\arraystretch{1.5} \begin{array}{c} -5的二进制 &11111011\\ \hline 减一 &11111010 \\ \hline 取反得到5 &00000101\\ \end{array}
−5的二进制减一取反得到5111110111111101000000101
2.字节
2.1什么是字节?
字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
一个字节存储8位无符号数,储存的数值范围为0-255。如同字元一样,字节型态的变数只需要用一个位元组(8位元)的内存空间储存。
2.2 单位
bit与Byte
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
思考1:为什么Byte要用8位?
计算机设计之初为了传递数字和一些符号信息,制订了美国信息交换标准代码,ASCII编码:全称American Standard Code for information Interchange,翻译过来就是美国信息交换标准码,而发现需要七位才能满足编码要求,但是一个字节不可能规定为7位,所以可以说这一标准也促进了将8位作为一个字节的形成, 就这样8位也就成了标准的1字节了。
思考2:为什么一个字节存储8位无符号数,储存的数值范围为0-255?
由于一个字节储存的数值范围为0-255,则有
最大值 255 对应二进制数 11111111 恰好达到二进制8位满1,则8位二进制数可以表示任何0-255的数。
2.3 计算机存储换算
信息存储量是度量存储器存放程序和数据的数量。其主要度量单位是字节,1个字节(Byte)等于8位(b)二进制。位(bit,Binary Digits):存放一位二进制数,即0或1,为最小的存储单位,8个二进制位为一个字节单位。一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。英文标点占一个字节,中文标点占两个字节 。
常用换算:
1字节(Byte)=8位(bit)
1KB( Kilobyte,千字节)=1024B
1MB( Megabyte,兆字节)=1024KB
1GB( Gigabyte,吉字节,千兆)=1024MB
1TB( Trillionbyte,万亿字节,太字节)=1024GB
C#值类型换算:
类型 | 位 | 字节 |
---|---|---|
bool | 8 | 1 |
byte | 8 | 1 |
char | 16 | 2 |
decimal | 128 | 16 |
double | 64 | 8 |
float | 32 | 4 |
int | 32 | 4 |
long | 64 | 8 |
sbyte | 8 | 1 |
short | 16 | 2 |
uint | 32 | 4 |
ulong | 64 | 8 |
ushort | 16 | 2 |
C# sizeof() 方法字节校验代码:
Console.WriteLine("bool size:"+ sizeof(bool));
Console.WriteLine("byte size:" + sizeof(byte));
Console.WriteLine("char size:" + sizeof(char));
Console.WriteLine("decimal size:" + sizeof(decimal));
注:引用类型如string,在不同的编码转换后的字节数不同,如unicode中一个汉字的字节数为2,而utf8中一个汉字的字节数为3,如下代码所示
string s = "好";
byte[] unicodeStringByte = Encoding.Unicode.GetBytes(s);
byte[] utf8StringByte = Encoding.UTF8.GetBytes(s);
Console.WriteLine("defaulStringByte size:" + unicodeStringByte.Length);
Console.WriteLine("utf8StringByte size:" + utf8StringByte.Length);
运行结果: