补补算术基础:编程中的进制问题

关于二进制、八进制、十六进制以及它们与十进制的关系和转换。详细地请参考下面的文章(写得还不错)

http://www.d2school.com/bcyl/bhcpp/newls/ls06.htm

在我们编程过程中,用得最多的是十进制,然后是十六进制,他们的转换在c#中主要用两个方法

Convet.ToString() 和 Convert.ToInt32()

 

我总结几点:(以下黑体,斜体字是我的总结摘要)

6.1 为什么需要八进制和十六进制?

关于这一点,首先因为进制越大,表示一个数字就越短。计算机只认识二进制,但二进制我们不好理解,它太长,而且很不直观。八进制和十六进制因为都是2的整数幂(八进制是2^3,而十六进制是2^4),所以他们本身很好转换为二进制。

但是为什么我们通常用的又不是八进制和十六进制,而是十进制呢?这又是一个问题。

6.2 二、八、十六进制数转换到十进制数

总结来说,这些进制转换为十进制的算法类似如下

八进制1507换算成十进制。

第0位 7 * 80 = 7

第1位 0 * 81 = 0

第2位 5 * 82 = 320

第3位 1 * 83 = 512   +

--------------------------

              839(十进制)

就是说把这个数的不同位的值乘上一个与当前进制有关的权数。第0位就乘以进制的0次方,第1位就乘以进制的1次方,以此类推。

6.3 十进制数转换到二、八、十六进制数

 

反过来,要把十进制转换为其他的进制,算法大致如下

将商继续除以对应的进制(例如2,8,16),直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

例如要把十进制中的6转换为2进制,按照下面的方式运算,然后将余数倒过来,就是110.

被除数 计算过程 余数
6 6/2 3 0
3 3/2 1 1
1 1/2 0 1

 

还有一个关键问题,如何在编码中表示一个八进制或十六进制呢?例如给你一个数字:123。你怎么知道是八进制,还是十六进制,还是十进制呢?

为了以示区分,八进制要加上一个0(零)的前缀,例如123应该书写为0123;而十六进制要加上一个0x的前缀,例如123应该书写为0x123

关于转义字符的问题,一般忽略不考虑

 

6.4 二、十六进制数互相转换

6.5 原码、反码、补码

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码

比如 00000000 00000000 00000000 00000101 是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

从本质上说,只有十进制有正负之分,其他进制都没有。那么如果要表示负数怎么办呢?就是先用二进制取得原码,然后取反码,然后取补码。然后再根据情况转换为其他进制。

那么还有一个问题,就是如何表示小数?

 

6.6 通过调试查看变量的值

6.7 本章小结

posted @ 2008-09-18 08:20  陈希章  阅读(943)  评论(0编辑  收藏  举报