《Write Great Code》Chapt 2 Numberic
又见好书,今天图书馆看了第一卷:Understanding the Machine
这是讲解计算机底层细节的,正是这点上,填充了世面上很多编程书的空缺。
的确,要更清楚的了解这些,一本厚厚的书都可以,推荐《深入理解计算机系统》CMU计算机系主任写的,我看过,很赞
但是当我们伟大社会主义教育开始教我们的时候,有几个人教你为什么那样,只会教你就要这样!
比如,你上大学编程课的时候,有老师告诉你操作系统到底帮你解决了哪些问题,程序和操作系统怎样交互的吗? 你又知道运行时内层如何布局的吗?你又怎样知道运行时库做了些什么?C标准库都是可移植的吗?甚至你知道编译器到底在背后做了什么手脚?你清楚哪些代码是可移植的,哪些代码是机器相关或系统相关的?如果历史倒回,没有操作系统、没有编译器,你怎样让计算机帮你做事?等等等...我们是可悲的,我们知其然,却不知其所以然...老美是幸福的,它们创造了规则,他们游戏其间而恢恢乎有余!
言归正传,让别人去大学学习那些该见鬼去的东西吧,我标榜自己爱穷根刨底,于是我选择了不是处于高级和低级语言之间的语言:C/C++。也许等我哪天真的要求对计算机的控制欲膨胀时,我可能去垂青于assembly。甚至哪天,我干脆就直接用机器码写代码...哈哈,这个有点退步了.但是,还有什么比完全掌控更让人满足的呢?
书籍是人类进步的阶梯,不是吗?
Ranall hyde: 此人甚牛,以下书的作者,他推荐用的assembly: High Level Assembly
<the Art of Assembly>
http://webster.cs.ucr.edu/AoA/index.html
<Write great code>
http://webster.cs.ucr.edu/WriteGreatCode/index.html
第2章 Numeric Representation
2.1 什么是数?
数:number
one of a series of symbols of unique meaning in a fixed order that can be derived by counting.
数字: digit
Such a symbol used in a system of numeration.
- 数的表示通常是一些符号序列
- 数的表示方式并不唯一
2.2 计数系统
- 位值法(positional notation system): 表示紧凑,容易辨认
- 非位值法(non-positioanal notation system):对实物计数比较方便,但是此表示占用空间与数值成正比
常见的非位值计数法:
tally-slash:
中国选举投票的“正”字法:
下面介绍我们常用的位值计数系统:
2.2.1 十进制
2.2.2 进制(基数)
2.2.3 二进制
二进制转十进制:
110010102 :
1x107+1x106+0x105+0x104+1x103+0x102+1x101+0x100
20210
十进制转二进制:
不停作除法,商是偶数插入0,商是奇数插入1
8410
2.2.4 十六进制计数
优点:比二进制紧凑,而且与二进制转换非常方便
十六进制和二进制转换方法是按4bit分组
八进制和二进制转换方法是按3bit分组
2.3 数与字符串的表示
考虑下列问题:
通常我们需要一个整数,用户从控制台输入的是一个字符串,那么整型变量如何得到数的呢?
原来运行时库(run-time library)负责将字符转换为CPU需要的内部二进制形式
你需要清楚这种转换是需要代价的,具体的转换算法这里不讨论
下面任何一个都涉及到字符串与数字的转换:
printf("%d", i); //C
cout << i; //C++
2.4 数的内部表示
2.4.1 位bit
2.4.2 位串 bit string
半字节nibble: 4 bits
字节byte: 8 bits
字word:依赖于CPU, 80X86的机器字为16 bits
双字dword: 80x86 CPU为32 bits
长字long word: 80x86 CPU为64 bits
tbyte: 10字节,用来存储扩展精度浮点数,以及BCD数