⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 教学--第四章 数据类型.htm

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 4 页
字号:
          align=middle width="10%">2</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">0</TD>
          <TD 
          style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="13%" rowSpan=3>合计</TD></TR>
        <TR>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          width="15%">权值</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">2<SUP>7</SUP>=128</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">2<SUP>6</SUP>=64</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">2<SUP>5</SUP>=32</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">2<SUP>4</SUP>=16</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">2<SUP>3</SUP>=8</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">2<SUP>2</SUP>=4</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">2<SUP>1</SUP>=2</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">2<SUP>0</SUP>=1</TD></TR>
        <TR>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          width="15%">2进制</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="9%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">1</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid" 
          align=middle width="10%">1</TD></TR>
        <TR>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          width="15%">10进制</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="9%">128</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="9%">64</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="9%">32</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="9%">16</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="9%">8</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="10%">4</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="10%">2</TD>
          <TD 
          style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle width="10%">1</TD>
          <TD 
          style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" 
          align=middle 
      width="13%"> 255</TD></TR></TBODY></TABLE>上表表示了这么一个计算过程(*表示乘号): 
      <P>1 * 2<SUP>7</SUP> + 1 * 2<SUP>6</SUP> + 1 * 2<SUP>5</SUP> + 1 * 
      2<SUP>4</SUP> + 1 * 2<SUP>3</SUP> + 1 * 2<SUP>2</SUP> + 1 * 2<SUP>1</SUP> 
      + 1* 2<SUP>0</SUP> = 255</P>
      <P>(顺便说一句,如果你忘了2<SUP>0 </SUP>等于多少有点迟疑,请复习一下初中的数学知识:任何数的0次方都等于1)</P>
      <P>结果是:</P>
      <P>11111111(b) = 255 (d)</P>
      <P>(为不了互相混淆,我们在书中常用(b)来表示前面的数是2进制的,而(d)则表示该数是10进制数。同样地,另有8进制数用(o)表示,16进制用(h)表示。不过记住了,这只是在书中使用,在程序中,另有一套表示方法。)</P>
      <P> </P>
      <P>以前我们知道1个字节有8位,现在通过计算,我们又得知:1个字节可以表达的最大的数是255,也就是说表示0~255这256个数。</P>
      <P>那么两个字节(双字节数)呢?双字节共16位。 
      1111111111111111,这个数并不大,但长得有点眼晕,从现在起,我们要学会这样来表达二制数:</P>
      <P>1111 1111 1111 1111,即每4位隔一空格。</P>
      <P>双字节数最大值为:</P>
      <P>1 * 2<SUP>15</SUP> + 1 *2<SUP>14</SUP> + 1* 2<SUP>13</SUP> + 1 * 
      2<SUP>12</SUP> + 1 * 2<SUP>11</SUP> + 1 * 2<SUP>10</SUP> + …… + 1 * 
      2<SUP>2</SUP> + 1 * 2<SUP>1</SUP> + 1* 2<SUP>0</SUP> = 65535</P>
      <P> </P>
      <P>很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具体的计算方法方法是,如果它有n位,那么最大值就是:</P>
      <P><B>n位二进制数的最大值:1 * 2</B><SUP>(n-1)</SUP><B> + 1 * 
      2</B><SUP>(n-2)</SUP><B> + ... + 1 * 2</B><SUP>0</SUP></P>
      <P> </P>
      <P>任何一种基本数据类型,都有其范围。比如字符类型,它的最大值是255,那么,当一个数在其类型的范围已经是最大值时,如果再往上加1,就会照成“溢出”。</P>
      <P>其实,有限定的范围的数量,并不只在计算机中出现。钟表就是一个例子。10点再加1点是11点,再加1点是12点,可是再加1点,就又回到1点。再如汽车的行程表,假设最多只能显示99999公里,当达到最高值后继续行驶,行程表就会显示为00000公里。</P>
      <H4><A name=4.2.4>4.2.4</A> 理解有符号数和无符号数</H4>
      <P>回头看上一节,我们所讲的数都是正数。同样是年纪和工资,前者不需要有负值,但后者可能需要——至少所有的老板都这样认为。</P>
      <P>那么,负数在计算机中如何表示呢?</P>
      <P>这一点,你可能听过两种不同的回答。</P>
      <P>一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切。再者,用“补码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以和答案?&nbsp;</P>
      <P>另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释,为什么字符类型的-1用二进制表示是“1111 
      1111”(16进制为FF);而不是我们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示负数,那1000 
      0001不是正好是-1吗?)。</P>
      <P>让我们从头说起。</P>
      <P>1、你自已决定是否需要有正负。</P>
      <P>就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。</P>
      <P><B>在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。</B></P>
      <P><B>数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。</B></P>
      <P><B>字符类型也分为有符和无符类型。</B></P>
      <P>比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。</P>
      <P>2、使用二制数中的最高位表示正负。</P>
      <P>首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。</P>
      <P>(红色为最高位)</P>
      <P>单字节数: <B><FONT color=#ff0000>1</FONT></B>111 1111</P>
      <P>双字节数: <B><FONT color=#ff0000>1</FONT></B>111 1111 1111 1111</P>
      <P>四字节数: <B><FONT color=#ff0000>1</FONT></B>111 1111 1111 1111 1111 1111 
      1111 1111</P>
      <P> </P>
      <P>当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。</P>
      <P>当我们指定一个数量是无符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。</P>
      <P> </P>
      <P>3、无符号数和有符号数的范围区别。</P>
      <P>无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:</P>
      <P>无符号数: 1111 1111&nbsp;&nbsp; 值:255 1* 2<SUP>7</SUP> + 1* 2<SUP>6</SUP> + 
      1* 2<SUP>5</SUP> + 1* 2<SUP>4</SUP> + 1* 2<SUP>3</SUP> + 1* 2<SUP>2</SUP> 
      + 1* 2<SUP>1</SUP> + 1* 2<SUP>0</SUP></P>
      <P>有符号数: 0111 1111&nbsp;&nbsp; 
      值:127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1* 2<SUP>6</SUP> + 
      1* 2<SUP>5</SUP> + 1* 2<SUP>4</SUP> + 1* 2<SUP>3</SUP> + 1* 2<SUP>2</SUP> 
      + 1* 2<SUP>1</SUP> + 1* 2<SUP>0</SUP></P>
      <P> </P>
      <P>同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。</P>
      <P>不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:</P>
      <P>无符号数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      0 ----------------- 255</P>
      <P>有符号数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -128 --------- 0 
      ---------- 127</P>
      <P> </P>
      <P>同样是一个字节,无符号的最小值是 0 
      ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。</P>
      <P>一个有符号的数据类型的最小值是如何计算出来的呢?</P>
      <P>有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法<B>不能直接使用</B>1* 
      2<SUP>6</SUP> + 1* 2<SUP>5</SUP> 
      的公式进行转换。在计算机中,负数除为最高位为1以外,还采用<B>补码</B>形式进行表达。所以在计算其值前,需要对补码进行还原。这些内容我们将在第六章中的二进制知识中统一学习。</P>
      <P>这里,先直观地看一眼补码的形式:</P>
      <P>以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。</P>
      <P>那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。</P>
      <P>然而,事实上计算机中的规定有些相反,请看下表:</P>
      <P>&nbsp;</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -