C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?

文章目录

    • 1.计算机为什么采用二进制?
    • 2.比特位(bit)与字节(Byte)的关系?
      • 1.比特位(bit)的引入?
      • 2.字节(Byte)的引入?
      • 3.为什么一个字节是8位二进制,而不是其他数目?
    • 3.二进制与八进制、十进制、十六进制之间的转换?
      • 1.八进制、十六进制的定义?
      • 2.二进制与八进制之间的转换?
      • 3.二进制与十六进制之间的转换?
      • 4.二进制与十进制之间的转换?
      • 5.二进制、八进制、十进制、十六进制对照表
    • 4.内存中为什么使用十六进制?

1.计算机为什么采用二进制?

最初的时候,计算机是由二极管发展而来的。每个二极管能表达二种信号,就是接通电路或关闭电路两种状态(1 & 0)如果有2个二极管,就可以根据顺序,表达出4种状态(00 & 01 & 10 & 11), 那么如果有N个二极管,那就可以表达出二的N次方(2ⁿ)个状态。根据这种理论,就可以保存的信息就很多。最终需要做的就是,00代表啥,01代表啥,11代表啥,定义好之后,所有的组合到一起,就成了语句或十进制数字了。

2.比特位(bit)与字节(Byte)的关系?

1.比特位(bit)的引入?

上面讲到二进制的引入,为了表达每一个二极管(比特位)的信息,把这个最小的信息单元叫比特位。每个比特位存放0或1。

2.字节(Byte)的引入?

1字节(byte,字节)= 8 bit

  • 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。
  • 字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit)。
  • 八位二进制数最小为00000000,最大为11111111;
  • 通常1个字节可以存入一个ASCII码(128个字符),2个字节可以存放一个汉字国标码。

字节 --百度百科

个人理解是:

  • 如果一篇英文文章没有把单词、标点、段落等分开,会非常不便于阅读,例如helloworldmynameisalien,这个你根本不知道啥意思,但是hello world, my name is alien ,你就知道啥意思了。
  • 所以,计算机为了阅读二进制数,把一个字节(8位二进制)区分开来,当做一个单词或者字,然后再去阅读。
    10010110 00001111 10100000 类似这样的,计算机看做为3个字

3.为什么一个字节是8位二进制,而不是其他数目?

可以看一下ASCII的定义,应为早期的ASCII为了表达出所有需要表达的字母和一些特殊符号,发现8位二进制就能基本表达所有英文字母、特殊符号了。详情可参考如下链接,这样我们就可以把8位二进制当做一个字节,去代表一个计算机能识别的最小语言单位。

ASCII码–百度百科

3.二进制与八进制、十进制、十六进制之间的转换?

1.八进制、十六进制的定义?

八进制

  • 八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。
  • 八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。

十六进制

  • 十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。
  • 十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位)
  • 内存中保存数据以及内存地址,都是十六进制

2.二进制与八进制之间的转换?

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第1张图片

3.二进制与十六进制之间的转换?

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第2张图片

4.二进制与十进制之间的转换?

十进制转化二进制的方法(除2倒序取余法):

用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第3张图片

十进制的小数转换成二进制(小数乘二正序取整法):

小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第4张图片

如上这种方法保存小数,容易产生数据精度失真的情况。原始数据可能一摸一样,但最终保存到计算机中,内容是一样的。后面会提到单精度和双精度小数的问题。

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第5张图片

通过如上的转换,我们发现无论计算机需要存储多少位二进制,例如10101010001110101101,我们都不用担心不方便阅读的问题,因为我们可以根据不同的进制去读取,虽然存储都是以二进制形式存储的。所以,最终计算机会根据实际的应用场景,会使用十六进制、八进制的格式去存储信息。

5.二进制、八进制、十进制、十六进制对照表

十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10

4.内存中为什么使用十六进制?

  • 前面提到,我们把八个比特位当做一个字节,字节又是计算机存储信息的最小单位。如果想充分利用比特位的信息,每个比特位都完全利用上,就能充分利用每个比特位上的存储空间。(重要, 重要,重要!!!!)

  • ASCII码–百度百科 里面,总共存储了128个字符,占用的是一个字节。但其实,一个字节可以有2的8次方(2^8=256)可能,也就是说,ASCII其实还是可以拓展信息的,有一半空间没有充分利用。

  • 十六进制(0–9, A、B、C、D、E、F)共计十六个数,可以理解为(2^4)个信息。

  • 而一个字节是(2^8)个信息, 那么一个字节正好可以保存2个十六进制数据,且完全利用上所有比特位。

十进制(0–9)共计10个数,需要使用4个比特位才能存储下来,但4个比特位其实可以以存储16个数据信息的,只存储了10个数据,则存储空间就浪费了很多,而且检索数据的时候,空的地址符还需要再去检索,也是浪费时间。
同理,八进制(2^3)占用3个比特位,一个字节8个比特位,只能保存2个八进制,且有2个比特位没使用,这样也没有充分利用空间。

C语言基础--比特位与字节的关系,二进制、八进制、十六进制之间的转换,内存为什么使用十六进制?_第6张图片

内存中,一个字节的十六进制数据可以对应二进制是4个字节,所以内存中,存储数据的空间利用率非常高效。

参考文档:
https://jingyan.baidu.com/article/495ba84109665338b30ede98.html
https://www.jianshu.com/p/919a9019e6ac

你可能感兴趣的:(C/C++基础)