在C/C++中,很多计数的习惯都是从0开始,所以,在你看明白上面那行内容后,让我 们立刻改口换成下面的说法,以后我们只用这种说法 二进制数:第0位数表示几个1(20),第1位数表示几个2(2),第3位数表示几 个4(2),第4位数表示向个8(2)…… 按照这种说法,我们可以发现,从右向左数,第n位数的权值=2的n次方 进制各位权值的计算方法:第n位权值=2 下表详细地表示2进制数:1111111是如何逐位计算,累加得到10进制的值 25=3 合计 进制 l0进制 8 255 上表表示了这么一个计算过程*表示乘号): 1*22+1*26+1*25+1*24+1*23+1*2+1*24+1*2°=255 (顺便说一句,如果你忘了2等于多少有点迟疑,请复习一下初中的数学知识:任何数 的0次方都等于1) 结果是 111111255(d) (为不了互相混淆,我们在书中常用(b)来表示前面的数是2进制的,而(d)则表示该数 是10进制数。同样地,另有8进制数用(o)表示,16进制用(h)表示。不过记住了,这只是 在书中使用,在程序中,另有一套表示方法。) 以前我们知道1个字节有8位,现在通过计算,我们又得知:1个字节可以表达的最大的 数是255,也就是说表示0255这256个数。 那么两个字节(双字节数)呢?双字节共16位。111111个数并不大, 但长得有点眼晕,从现在起,我们要学会这样来表达二制数: 1111111111,即每4位隔一空格 双字节数最大值为 1*2+1*+1*2+ +1*2+1*2+ +1*2+1*2 2°=65535
在 C / C++中,很多计数的习惯都是从 0 开始,所以,在你看明白上面那行内容后,让我 们立刻改口换成下面的说法,以后我们只用这种说法: 二进制数:第 0 位数表示几个 1 (2 0),第 1 位数表示几个 2(2 1),第 3 位数表示几 个 4(2 2),第 4 位数表示向个 8(23 )…… 按照这种说法,我们可以发现,从右向左数,第 n 位数的权值 = 2 的 n 次方。 二进制各位权值的计算方法: 第 n 位权值 = 2n 下表详细地表示 2 进制数:11111111 是如何逐位计算,累加得到 10 进制的值: 第几位 7 6 5 4 3 2 1 0 权值 2 7=128 2 6=64 2 5=32 2 4=16 2 3=8 2 2=4 2 1=2 2 0=1 合计 2 进制 1 1 1 1 1 1 1 1 10 进制 128 64 32 16 8 4 2 1 255 上表表示了这么一个计算过程(*表示乘号): 1 * 27 + 1 * 26 + 1 * 25 + 1 * 24 + 1 * 23 + 1 * 22 + 1 * 21 + 1* 20 = 255 (顺便说一句,如果你忘了 2 0 等于多少有点迟疑,请复习一下初中的数学知识:任何数 的 0 次方都等于 1) 结果是: 11111111(b) = 255 (d) (为不了互相混淆,我们在书中常用(b)来表示前面的数是 2 进制的,而(d)则表示该数 是 10 进制数。同样地,另有 8 进制数用(o)表示,16 进制用(h)表示。不过记住了,这只是 在书中使用,在程序中,另有一套表示方法。) 以前我们知道 1 个字节有 8 位,现在通过计算,我们又得知:1 个字节可以表达的最大的 数是 255,也就是说表示 0~255 这 256 个数。 那么两个字节(双字节数)呢?双字节共 16 位。 1111111111111111,这个数并不大, 但长得有点眼晕,从现在起,我们要学会这样来表达二制数: 1111 1111 1111 1111,即每 4 位隔一空格。 双字节数最大值为: 1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + …… + 1 * 22 + 1 * 21 + 1* 2 0 = 65535
很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具体的计算方 法方法是,如果它有n位,那么最大值就是 n位二进制数的最大值:1*2(m)+1*2-2 +1*2° 任何一种基本数据类型,都有其范围。比如字符类型,它的最大值是255,那么,当一个 数在其类型的范围己经是最大值时,如果再往上加1,就会照成“溢出”。 其实,有限定的范围的数量,并不只在计算机中出现。钟表就是一个例子。10点再加1 点是11点,再加1点是12点,可是再加1点,就又回到1点。再如汽车的行程表,假设 最多只能显示99公里,当达到最高值后继续行驶,行程表就会显示为00000公里。 4.2.4理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数。同样是年纪和工资,前者不需要有负值,但后 者可能需要一一至少所有的老板都这样认为 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答 种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念 说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切。再者,用“补 码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。 却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数, 最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它 不能解释,为什么字符类型的-1用二进制表示是“1111111”(16进制为FF):而不是我 们更能理解的“10000001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示 负数,那10000001不是正好是-1吗?) 让我们从头说起 1、你自已决定是否需要有正负 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决 定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型
很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具体的计算方 法方法是,如果它有 n 位,那么最大值就是: n 位二进制数的最大值:1 * 2(n-1) + 1 * 2(n-2) + . .. + 1 * 2 0 任何一种基本数据类型,都有其范围。比如字符类型,它的最大值是 255,那么,当一个 数在其类型的范围已经是最大值时,如果再往上加 1,就会照成“溢出”。 其实,有限定的范围的数量,并不只在计算机中出现。钟表就是一个例子。10 点再加 1 点是 11 点,再加 1 点是 12 点,可是再加 1 点,就又回到 1 点。再如汽车的行程表,假设 最多只能显示 99999 公里,当达到最高值后继续行驶,行程表就会显示为 00000 公里。 4.2.4 理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数。同样是年纪和工资,前者不需要有负值,但后 者可能需要——至少所有的老板都这样认为。 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答。 一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一 说就得一节课,这一些我们需要在第 6 章中用一章的篇幅讲 2 进制的一切。再者,用“补 码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。 却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是 0,表示正数, 最高位是 1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它 不能解释,为什么字符类型的-1 用二进制表示是“1111 1111”(16 进制为 FF);而不是我 们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是 1 时表示 负数,那 1000 0001 不是正好是-1 吗?)。 让我们从头说起。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决 定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型