“嗨,阿米戈!”
“嗨,比拉博!”
“我想告诉你一些不同的编号系统。”
“您已经听说过人们使用十进制系统。以下是该系统的主要事实:
1) 10位数字用于写数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9。
2) 数字 543 表示 5 个百 + 4 个十 + 3 个个。
"这相当于写成5*100 + 4*10 + 3*1,可以写成5*10 2 + 4*10 1 + 3*10 0。
请注意,千、百、十和个是数字 10 的幂。
1)一是 10 的零次方。
2) 十是 10 的一次方。
3)一百是 10 的二次方。
4) 一千是 10 的三次方,等等。
“是的。知道了。”
“但现在想象一下,我们只有 8 位数字。然后我们有了八进制系统。以下是它的主要事实:”
1) 8位数字用于写数字:0、1、2、3、4、5、6、7。
2) 数字 543 8表示 5*8 2 +4*8 1 +3*8 0。也就是说,5*64 + 4*8 + 3*1 = 320+32+3 = 320+32+3=355 10
我写了8和10作为下标,表示用多少位数来表示这个数。
“我想我明白了。我想我可以将一个数字从八进制系统转换为十进制系统。但我可能无法采用其他方式。”
“没那么难,想象一下,你需要用几辆卡车来搬运一堆沙子。你有自卸车,有普通卡车,也有非常小的卡车。但卡车没有装满就走不了。”
“你会怎么做?”
“首先,我会装满自卸卡车,因为它们是最大的。然后,当我发现没有足够的沙子装满卡车时,我会换成较小的车辆。然后是更小的车辆。”
“这里其实很相似,我们试试把355 10这个数字转回八进制吧。”
“首先,我们将它除以 64 (8 2 ),得到 5,余数为 35。这意味着我们数字的第一位数字是 5。然后我们将余数除以 8 (8 1 ),得到 4,余数的 3。因此,我们得到数字 543 8。 ”
”对了,你也可以往另一个方向移动,毕竟543 8 == 5*64+4*8+3 == ((5)*8+4)*8+3。我们的八进制“tens " 和 "hundreds" 必须除以 8。因此,除以 8 的余数将是我们的八进制数字。"
“首先,我们将355除以8,得到44,余数为3。即355=44*8+3。44可以表示为5*8+4。因此,355=(5*8+ 4)*8+3; 这是我们的数字:5, 4, 3。我们要找的数字是 543 8。"
“我想我明白了,但我需要多加练习才能完全理解所有内容。”
“编程通常涉及使用不同基数的数字(即数字系统中使用的位数)。最流行的是 2、8、10、16 和 64。”
“但为什么这是必要的?为什么我们需要用 2、8、16 或 64 位数字表示的数字?”
“这是关于处理器内部如何工作的。很简单,如果有电流流过电线,那么我们说它的值为1;如果没有电流,那么它的值为0。所有数字都存储在存储单元中。这些细胞有一个非常基本的设计。它们只能存储 0 或 1。”
“但这种简化(只有 0 或 1)使得处理器和内存内部的元件变得非常小成为可能。现代处理器和内存模块包含数十亿个不同的元件。它们的面积通常不超过一平方厘米。”
“哇。现在我知道了。”
“现在我们转向二进制数。这里我们有与八进制相同的东西,只是更容易。”
1) 2位数字用于写数字:0、1。
2) 数字 101 2表示 1*2 2 + 0*2 1 + 1*2 0。换句话说,就是 1*4+0*2+1*1 =4+1=51 10
“是的,我记得。一个单元格,可以有 0 或 1 的值,被称为位。但它不能存储太多信息,所以它们被组合成 8 个一组。这些组称为字节。 “
“没错。一个字节是一组八位。它可以存储以下值:00000000、00000001、... 11111111。这些值对应于十进制数 0,1、... 255。这使我们总共有256 个值。”
Java中最大的整数是多少?或者更确切地说,它的类型是什么?
“一个长整型。一个长整型由 8 个字节组成。换句话说,64 位。它可以存储从 -2 63到 2 63 -1 的值。
“是的。我不会涉及如何将数字从十进制转换为二进制,反之亦然。否则,课程会太长。”
“相反,让我们多谈谈十六进制系统。”
“是的,这很有趣。对于二进制和八进制系统,我们只是去掉了数字,分别从二和八开始。但是我们在这里做什么?添加新数字?”
“完全正确!看看这个:”
1) 16位数字用于写数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
2)数字 543 16表示 5*16 2 + 4*16 1 + 3*16 0。换句话说,它是 5*256+4*16+3*1 = 1280+64+3 = 1347 10
“所以,我们只是将字母添加为数字?O_o”
“是的。有什么大不了的?为什么要在字母工作得很好的情况下发明新数字?检查一下:”
十六进制数字 | 十进制值 |
---|---|
0 | 0 |
1个 | 1个 |
8个 | 8个 |
9 | 9 |
A | 10 |
乙 | 11 |
C | 12 |
丁 | 13 |
乙 | 14 |
F | 15 |
“我也不打算谈论从十进制到十六进制的转换。但这是一个有趣的事实。十六进制数字正好由 4 位表示,值从 0 到 15。因此,一个字节可以用八个二进制数字写入(0 或 1)或两个十六进制数字。”
“这是一个例子:”
十进制数 | 二进制数 | 十六进制数 |
---|---|---|
0 | 0000 0000 | 00 |
1个 | 0000 0001 | 01 |
15 | 0000 1111 | 0f |
16 | 0001 0000 | 10 |
31 | 0001 1111 | 1f |
32 | 0010 0000 | 20 |
128 | 1000 0000 | 80 |
129 | 1000 0001 | 81 |
255 | 1111 1111 | ff |
“十六进制表示很容易转换为二进制(反之亦然)。这就是为什么在编程中很少以二进制(使用 0 和 1)给出数字的内部字节表示。那样太长且难以理解。十六进制表示法更具可读性和紧凑性。”
“我同意。连我都喜欢。”
“顺便说一句,Java 允许您直接在代码中编写各种编号系统中的数字:”
根据 | 特色 | 例子 | 无效数字 |
---|---|---|---|
2个 | 数字开头的0b | 0b 00001111 | 0b 11111 2 1 |
8个 | 数字开头的0 | 0 1234343 | 0 12 8 |
10 | 没有任何 | 95459 | 909个 |
16 | 数字开头的0x | 0x 10ff | 0x 1c高 |
“很棒的一课。谢谢你,Bilaabo。”
GO TO FULL VERSION