主页 > imtoken官网是哪个 > 预备知识:Java编程基础->基数转换

预备知识:Java编程基础->基数转换

imtoken官网是哪个 2024-01-01 05:14:24

实验介绍

虽然计算机可以极快地执行运算,但它并没有像现实生活中的人类那样使用各种不同的数据类型——文本、数字、声音、图像等,而是使用仅包含 0 和 1 的二进制值。 . 当然,人输入计算机的数据是转换成二进制进行计算,而计算的结果又是由二进制转换成文本、整数、小数等。这是操作系统自动完成的,人不用需要手动完成。如果要了解数据在计算机中的存储方式,就必须了解二进制(以及八进制/十六进制)。人们通常使用的数字系统有十进制、二进制、八进制和十六进制。

最常用的数字系统是十进制系统。我们熟悉的十进制是用0、1、2、3、4、5、6、7、8、9这十个符号来描述的。计数规则是每一个小数,比如:10(读作一零)表示十。

同理,二进制用两个符号1、0来表示,计数规则是每二加一,例如:10表示二,11表示三,100表示​​四。

十六进制用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示。计数规则是每个十六进制一个,例如:A表示十, F 表示十五,3F 表示六十三。

目的

(1)掌握二进制、十进制、十六进制的转换。

(2)掌握二进制的具体应用,能解释IT领域很多常见的局限。

(3)掌握“模”的概念和原码、反码、补码的基本概念

实验过程

1.十进制表示法

对于十进制整数 327851000转换为十六进制,可以用加法、乘法和幂运算表示为:

32785 = 3*10^4 + 2*10^3 + 7*10^2 + 8*10^1 + 5*10^0

对于小数8693.357,可以表示为:

8693.457 = 8*10^3 + 6*10^2 + 9*10^1 + 3*10^0 + 4*10^-1 + 5*10^-2 + 7*10^ -3

2. 二进制表示法

对于二进制整数10101011,参照十进制表示,可以表示为:

10101011 = 1*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0

= 128 + 0 + 32 + 0 + 8 + 0 + 2 + 1 = 171

1000转换为十六进制

这也是二进制转十进制的基本方法。

那么对于二进制小数,我们也参考上面的表示方法,比如:

1101.101 = 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 + 1*2^-1 + 0*2^-2 + 1*2^ -3

= 8 + 4 + 0 + 1 + 0.5 + 0 + 0.125 = 13.625

3.十六进制表示法

D3A8 = D*16^3 + 3*16^2 + A*16^1 + 8*16^0

= 13*4096 + 3*256 + 10*16 + 8 = 54184

4.十进制转二进制

十进制整数转换为二进制整数的关键是:“每二进一,取反”,即:将一个十进制数除以二,再将得到的商除以二,以此类推,直到商为等于一或零。,除法的余数取反序,即转换为二进制数的结果

例如,如果将 52 转换为二进制数,则计算结果如下:

52除以2得到的余数为:0、0、1、0、1、1,逆序,所以52对应的二进制数为110100 .

然后,对于十进制小数到二进制的转换,实现了“乘二取整”,即小数的小数部分乘以2,得到整数部分(0或1),然后取小数部分继续乘以2,直到最后的整数部分和小数部分都为0。(当然也有可能一直取不到0,要么无限循环,要么无限循环1000转换为十六进制,那么这时,计算机中的小数运算可能会出现精度损失)。

例如十进制小数0.3125,对应的二进制表达式为:

让我们再看看。对于十进制0.4,对应的十进制表达式为:

我们可以看到,在乘法结束时,它又回到了0.4,所以这是一个二进制的无限循环。其二进制可以表示为:

1000转换为十六进制

0.01100110...(loop 0110),那么,此时,计算机将如何处理这个无限小数呢?我们将在后续实验中为您揭晓答案。

5.十进制转十六进制

与二进制一样,整数和小数的运算完全相同。

6.二进制和十六进制转换

事实上,在计算机中,二进制和十六进制是完全等价的,两者没有本质区别。通常为了保持一定的可读性,我们更习惯用十六进制来表示计算机机器码,而不是二进制。当然,既然两者没有区别,我们也不需要特别注意。由于 16 正好是 2 的 4 次方,我们只需将 4 位二进制放在一起即可转换为 1 位十六进制。转换过程可以一一对应:

0000 (0) 0001 (1) 0010 (2) 0011 (3) 0100 (4) 0101 (5)

0110 (6) 0111 (7) 1000 (8) 1001 (9) 1010 (A) 1011 (B))

1100 (C) 1101 (D) 1110 (E) 1111 (F)

那么,如果只有 6 位二进制应该怎么办呢?很简单,在6位小数前面加两个0,变成8位,然后进行等价转换。

7.原码、反码和补码

(1)机器数量:

计算机中数字的二进制表示,称为该数字的机器号。机器数是有符号的,计算机使用数字的最高位来存储符号,0 表示正数,1 表示负数。

比如十进制的数字+3,计算机字长是8位,转换成二进制是00000011,如果是-3,就是10000011。所以,这里的00000011和10000011就是机器号。

(2) 真值:

因为第一位是符号位,所以机器号的形式值不等于实际值。比如上面的有符号数10000011,它的最高位1代表负数,它的实数是-3而不是形式上的131(10000011转换成十进制等于131)。所以,为了区分,有符号位对应机器号的真值称为机器号真值。

示例:0000 0001 的真值 = +000 0001 = +1,1000 0001 的真值 = –000 0001 = –1

(3)原码:

原码是符号位加上真值的绝对值,即第一位代表符号,其余位代表数值。例如,如果它是一个 8 位二进制文​​件:

1000转换为十六进制

[+1] 原始 = 0000 0001

[-1] 原始 = 1000 0001

第一位是符号位。因为第一位是符号位,所以一个8位二进制数的取值范围是:

[1111 1111, 0111 1111]

即 [-127 , 127]

原始代码是理解和计算人脑表示的最简单方法。

(4) 反码:

反码的表示方法是:正数的反码是自身,负数的反码是在其原码的基础上,符号位保持不变,其他位取反。如:

[+1] = [00000001] 原始 = [00000001] 反向

[-1] = [10000001] 原始 = [11111110] 反向

可见,如果一个反码代表一个负数,人脑是无法直观看出其值的。它通常被转换成原始代码然后计算。

(5) 的补码:

补码的表示方法是:正数的补码是自身,负数的补码是在其原码的基础上,符号位不变,其他位取反,最后+1为添加。(即+1)基于反码,如:

[+1] = [00000001] 原 = [00000001] 逆 = [00000001] 补

[-1]=[10000001]原=[11111110]逆=[11111111]补

对于负数,补码表示也是人脑无法直观看到的,通常需要转换成原码来计算其值。

(6)计算机减法:

现在我们知道计算机可以用三种方式表示一个数字。对于正数,所有三种编码的结果都是相同的:

1000转换为十六进制

[+1] = [00000001] 原 = [00000001] 逆 = [00000001] 补

所以无需过多解释。但对于负数:

[-1]=[10000001]原=[11111110]逆=[11111111]补

可以看出,原码、反码和补码是完全不同的。既然原码是人脑直接识别出来的,用来计算表示的,为什么还有反码和补码呢?

首先,因为人脑可以知道第一位是符号位,所以我们在计算时会根据符号位选择真值区的加减法。(真值的概念在本文开头)。但是对于计算机来说,加减乘法器已经是最基本的运算了,应该设计得尽可能简单。计算机对“符号位”的识别,显然会使计算机的基本电路设计变得非常复杂!所以人们想出了一种在操作中包含符号位的方法。我们知道,按照算法减去一个正数就相当于加上一个负数,即: 1-1 = 1 + (-1) = 0 ,所以机器只能加不能减,

于是人们开始探索运算所涉及的符号位,只保留加法。先看原代码:

计算小数的表达式:1-1=0

1 - 1 = 1 + (-1) = [00000001] 原始 + [10000001] 原始 = [10000010] 原始 = -2

如果用原码表示,而且计算中还涉及到符号位,显然对于减法,结果是不正确的。这就是为什么计算机内部不使用原始代码来表示数字的原因。

为了解决原码相减的问题,出现了逆码:

计算小数的表达式:1-1=0

1 - 1 = 1 + (-1) = [0000 0001] 原始 + [1000 0001] 原始 = [0000 0001] 反向 + [1111 1110] 反向 = [1111 1111] 反向 = [1000 0000] 原始 = -0

发现减法是用反码计算的,结果的真值部分是正确的。唯一的问题实际上是特殊值“0”。虽然人们明白+0和-0是一样的,但是带符号的0是没有意义的。并且会有[0000 0000]原始和[1000 0000]原始两个代码来表示0。

所以补码的出现解决了0符号和两种编码的问题:

1-1 = 1 + (-1) = [0000 0001] 原始 + [1000 0001] 原始 = [0000 0001] 补码 + [1111 1111] 补码 = [0000 0000] 补码 = [0000 0000] 原始

这样0就用[0000 0000]表示,之前有问题的-0就不存在了。您可以使用 [1000 0000] 来表示 -128:

(-1) + (-127) = [1000 0001] 原始 + [1111 1111] 原始 = [1111 1111] 补码 + [1000 0001] 补码 = [1000 0000] 补码

-1-127 的结果应该是 -128。在补码运算的结果中,[1000 0000]的补码为-128。但是注意因为前面的-0的补码实际上是用来表示-128的,所以-128没有原码和一个补码。(-128的补码表示[1000 0000]的原码就是[0000 0000]的原码,不正确)

1000转换为十六进制

使用二进制补码不仅可以解决0的符号和两种编码的问题,而且可以多表示一个最小的数。这就是为什么8位二进制,[-127,+127]的范围用原码或反码表示,[-128,127]的范围用补码表示。

8.模块

将时钟视为 1 位十六进制数。如果当前时间是 10 点,我想将时间设置为 6 点,该怎么办?我们可以:

(1)回拨 4 小时:10 - 4 = 6

(2)向前拨 8 小时:(10 + 8) mod 12 = 6

(3)拨 8+12=20 小时前:(10+20) mod 12 = 6

第二种和第三种方法中,mod是指取模运算,18 mod 12 = 6,即18除以12后的余数为6。

所以时钟倒转(减法)的结果可以被倒转(加法)代替。

计算机使用类似的原理以加法代替减法进行计算。

9.位移:

1000左移2位->100000,即8 10,即8>>2 = 2,即移1位除以2。

因此,在计算机中,乘法和除法都是通过位移来操作的,既快捷又方便。

思维练习

(1)为什么32位操作系统只支持最大4G内存?

(2)为什么我经常听到当前IP地址用完了?

(3)为什么中文在操作系统中占2个字节?

(4)25 * 10,如何通过移位运算或加法运算得到结果?

(5)自行查阅相关资料,了解八进制及其转换。