c primer 第三章 A

第三章 数据和 C

在本章中你将学习下列内容:

1. 关键字:
int, short, long, unsigned, char, float, double, _Bool,
_Complex, _Imaginary

2. 运算符:
sizeof

3. 函数
scanf()

4. C 使用的基本数据类型。

5. 整数类型和浮点类型区别的区别。

6. 对上述类型,如何书写常量和声明变量。

7. 使用 printf() 和 scanf()函数读写各种类型数据的值。

3.1 示例程序

这里仍以一个示例程序作为开端。正如前面章节那样,我们将解释你感到不熟悉的地方。该程序的大致意图应该是很清晰的,因此请试着编译并运行程序清单 3.1 中的源代码。为了节省时间,输入源代码时,可略去注释。

程序清单 3.1 rhodium.c程序
-----------------------------------------------------------------------
/* rhodium.c --- 用金属铑衡量你的体重 */
#include <stdio.h>
int main (void)
{
float weight; //用户的体重
float value; //相等重量的铑的价值
printf (" Are you worth your weight in rhodium?\n");
printf ("Let's check it out.\n");
printf ("Please enter your weight in pounds: ");

scanf ("%f",&weight); // 从用户处获取输入 此处为这个示例的关键处

/* 假设铑为每盎司 770美元, 14.5833 把常衡制的英镑转换为金衡制的盎司 */
value = 770 * weight * 14.5833;
printf ("your weight in rhodium is $%.2f.\n",value); //$%.2f 看仔细这个输出参数
printf ("You are easily worth that! If rhodium prices drop,\n");
printf ("eat more to maintain your value.\n");
getchar();
getchar();
return 0;

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

Are you worth your weight in rhodium?
Let's check it out.
Please enter your weight in pounds: 150
your weight in rhodium is $1684371.12.
You are easily worth that! If rhodium prices drop,
eat more to maintain your value


此程序中的新元素

此程序中包含 C语言如下的一些新元素

1. 请注意代码中使用了一种新的变量声明。前面例子中只有整数变量(int),而本例中还包含了一个 浮点变量(float)类型,以便处理更大范围内的数据。float类型可以处理带有小数点的数字。

2. 程序还示范了常量的几种新写法,你现在就可以使用带有小数点的数了。

3. 要打印这种新的变量类型,请在 printf()代码中使用 %f 说明符来处理浮点值。对 %f 说明符
使用 .2 修饰词 即(%.2f)可以精确控制输出格式,使浮点数显示到小数点后两位。

4. 使用 scanf() 函数为程序提供键盘输入。%f 指示 scanf()从键盘读取一个浮点数,
&weight 指定将输入值赋于名为 weight 的变量中。scanf()函数使用 & 符号指示 weight变量 
的位置。下一章将进一步讨论 & 符号,现在请相信此处你需要它。

5. 也行本程序最突出的新特点是它的交互性。计算机向你询问信息,并使用你输入的数字。与非交互 性程序相比较,交互性程序使用起来更为有趣。更重要的是,交互性方法使程序更加灵活。


本章解释上述新特性列表中的前两项:各种数据类型的变量和常量。第4章“字符串和格式化输入/输出”将介绍后3项,本章极将继续使用 scanf()和 Printf()的有限功能。


3.2 变量与常量数据

在程序的指示下,计算机可以做很多事情,比如数值计算,名字排序,执行语音或视频命令,计算彗星轨道,准备邮寄列表,拔电话号码,画图,做决策以及任何其他可以想像到的事。要完成这些任务,程序需要使用数据,即承载信息的数字与字符。有些数据可以在程序使用之前预先设定并在整个运行过程中没有变化,这称为常量。另外的数据在程序运行过程中可能变化或被赋值,这称为变量。在示例程序中 weignt 是变量,而14.5833 则是常量。 770.0呢?虽然铑的价格不是一成不变的,但此程序中把它作为常量来对待。变量与常量的区别在于,就是的值可以在程序执行过程中变化与指定,而常量则不可以。

 

 

3.3 数据: 数据类型关键字

原来的 K&R 关键字 C90关键字 C99关键字
int signed _Bool
long void _Complex
short _Imaginary
unsigned
char
float
double
-----------------------------------------------------------------------------------

int关键字提供 C使用的基本整数类型。下面3个关键字(long,short和 unsigned)以及 ANSI附加的 signed用于提供基本类型的变种。char关键字用于表示字母以及其他字符(如#,%,和*)。
char类型也可以表示小的整数。

float,double和组合 long double表示带有小数点的数。

_Bool类型表示布尔值(true 和 false)。

_Complex 和 _Imaginary 分别表示复数和虚数。

这些类型可以按其在计算机中的存储方式被划分为两个系统,即整数(integer)和浮点数(floating-point)类型。

-----------------------------------------------------------------------------------
PS: 位,字节和字

术语:位,字节和字 用于描述计算机数据单位或机存储单位。这里主要指存储单位。

最小的存储单位称为 位(bit)。它可以容纳两个值(0或1)之一(或者可以称该位置被置为“关”或“开”)。不能在一个位中存储更多的信息,但是计算机中包含数量极其众多的位。位是计算机存储的基本单位。

字节(Byte)是常用的计算机存储单位。几乎对于所有的机器,1个字节均为 8位。

对于一种给定的计算机设计,字(word)是自然的存储单位。对于8位微机,比如原始的 Apple机,一个字正好有8位。使用80286处理器的早期 IBM兼容机是 16位机,这意味着一个字的大小为 16位。基于 Pentium 的 PC机和 Macintosh PowerPC 中的字是32位。更强大的计算机可以有 64位甚至更长位数的字。

3.3.1 整数类型与浮点数类型

对于人,整数和浮点数的区别在于它们的书写。对于计算机,区别在于它们的存储方式。下面分别地它们进行介绍。


3.3.2 整数

整数 (integer)就是没有小数部分的数。在 C中,小数点永远不会出现在整数的书写中。例如 2,-23 和 2456都是整数。数 3.14, 0.22 和2.000都不是整数。整数以二进制数字存储。例如整数 7的进制表示为 111,在 8位的字节中存储它需要将前 5位置0, 将后 3位置 1,如下图所示

图3.2 使用二进制编码存储整数 7
-----------------------------------------------------------------------
0 0 0 0 0 1 1 1 ---- 8位长的字
2^2 2^1 2^0
4 + 2 + 1 = 整数 7

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

3.3.3 浮点数

浮点数(floating-point)差不多可以和数学中实数(real number)概念相对应。实数包含了整数之间的那些数。2.75,3.16E7,7.00和 2e-8 都是浮点数。注意,加了小数点的数是浮点型值,所以 7 是整数类型,而 7.00是浮点型。显然,书写浮点数有多种形式。本书将在后面介绍 e 记数法,这里仅做简要介绍:简单地说,3.16E7 表示 3.16乘以 10的 7次方(即 1后面带有 7个 0),7称为 10的指数。

这里最重要的一点是浮点为数与整数的存储方案不同。浮点数表示法将一个数分为小数部分和指数部分并分别存储。因此尽管 7.00和整数 7有相同的值,但它们的存储方式不同。与机器中的二进制存储方式相似,在十进制中 7.0 可表示为 0.7E1,这里 0.7是小数部分,1 是指数部分。图3.3所示为浮点数存储的另一个例子。当然,计算机的内部存储使用二进制数字,它使用 2的幂而非 10的幂。在第 15章可以找到有关这一主题的更多讨论,这里我们只关注这两种类型在应用中的区别:


图 3.3 以浮点格式存储实数 (十进制版本)
---------------------------------------------------
+ .314159 1
符号 小数部分 指数部分
+ .314159 X 10^1 = 3.14159

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

浮点数往往只是实际值的近似。例如,7.0可能以浮点值 6.99999存储。稍后我 们将讨论更多有关精度的内容。

3.4.1 int 类型

C 提供多种整数类型。你可能不明白为什么一种类型不够用,答案是 C 为程序员提供了针对不同用途的多种选择。具体来讲,C 的各种整数类型的区别在于所提供数值的范围,以及数值是否可以取负值。int类型是基本选择,你还可以根据任务和机器的特殊需求选择其他类型。

int 类型是有符号整数,即 int类型的值必须是整数,可以是正的,负的或者是 0,其聚会范围依赖于计算机系统。一般地,int类型存储在计算机的一个字中。旧的 IBM PC兼容机有16位的字,因而使用 16位来存储一个 int值,取值范围为 -32768 到 32767 ,目前的个人计算机上的整数一般有 32位,使用 32位的 int值,详见本章结尾处的表 3.4 。现在,个人计算机向着 64位的处理器发展,自然而然将要使用更大的整数。 ISO/ANSI C规定 int类型的最小范围是 -32768 到 32767 。一般地,系统通过使用一个指示正负符号的特定位来表示有符号整数。第15章将讨论常用的方法。

一. 声明 int变量

int erns;
int hogs,cows,goats;

可以分别声明每个变量,也可以在一条语句中声明所有的 4个变量。效果是一样的,都将为 4个int大小的变量赋予名称并安排存储空间。

以上变量声明创建了变量但没有为其赋值。如果为变量赋值?前文已经出现了两种为变量赋值的方法。首先是直接赋值:

cows = 112;

其次,可以通过 scanf()这样的函数为变量赋值。下面介绍第三种方法。


二. 初始化变量

初始化(initialize)变量就是为变量赋一个初始值。C语言中,可以在声明语句中初始化变量,即在变量名后跟上赋值运算符(=)和要赋给变量的值,如下所示:

int hogs = 21;
int cows = 32, goats = 14;
int dogs,cats = 94; //该语句有效,但这种形式不是很好

最后一行中,只对 cats 进行了初始化。这种写法会让人误以为 dogs 也被初始化为94,所以最好避免在一个声明语中同时出现初始化和末初始化变量。

简言之,声明语句为变量创建,标定存储空间并为其指定初始值,如图 3.4所示

图 3.4 定义和初始化变量
-------------------------------------------------------------------------
int sows; -- 分配存储空间 □□□□□□□
|----------------------------------|

int boars = 2; -- 分配存储空间并赋值 □□□2□□□
|----------------------------------------|

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


三. int 类型常量

上面例子中的整数 21,32,14 和 94都是整数常量。 C把不含小数点和指数的数当作整数,比如 22 和 -44 都是整数常量, 而 22.0 和 2.2E1 则不是。 C把大多数整数常量看作 int类型。如果整数特别大,则有不同的处理。详细信息请参见后面的“long常量和 long long常量”小节中关于
long int类型的介绍。

四. 打印 int 值

可以使用 printf ()函数打印 int类型的值。在第2章我们已经介绍过中 %d 符号用于指示在一行中什么位置打印整数。%d 被称为格式说明符 (format specifier),因为它指示 printf()应使用什么格式来显示一个数值。格式串中的每个 %d 都必须对应于打印项目列表中的一个 int 值。这个值可以是 int变量,int常量或者其他的值为 int类型的表达式。你必须确保格式说明符的数目同待打印值的数目相同,编译器不会发现这种类型的错误。

程序清单 3.2是一个简单的程序,它初始化一个变量,并且打印了这个变量的值,一个常量的值以及一个简单表达式的值。 它也演示了当你粗心犯错时会导致什么结果。

程序清单 3.2 
-----------------------------------------------------
/* printl.c -- 说明 printf()的一些属性 */
#include <stdio.h>
int main (void)
{
int ten = 10;
int tow = 2;

printf("Doing it right:");
printf("%d minus %d is %d\n",ten,2,ten-tow);
printf("Doing it wrong:");
printf("%d minus %d is %d\n",ten); //忘掉二个参数
getchar();
return 0;
}

编译并运行上面的程序,则系统输出下列结果:
Doing it right: 10 minus 2 is 8
Doing it wrong: 10 minus 2 is 10

在第一行的输出语句中,第 1个 %d对应 int变量 ten,第 2个 %d对应 int常量 2,第 3个 %d对应 int表达式 ten-two的值。但第2次,程序使用 ten为第1个 %d提供打印值,然后使用内存中的任意值为其余的两个 %d 提供了打印值(你在运行该程序时获得的数值会不同于这里显示的数。不仅是因为内存中的内容可能不同,而且因为不同的编译器处理的内存位置不同)。

你可能会为编译器查不出这样明显的错误而烦恼,抱怨 printf()的非常规设计。大多数函数有确切的参数数目,编译器可以检查数目是否正确。然而,printf()可以有1个,2个,3个或更多的参数,这使得编译器无法使用常规的方法检查错误。记住,使用printf()函数时,格式说明符的数目和要显示的值的数目一定要相同。


五. 八进制和十六进制

前缀 0x 或者 0X表示使用十六进制,所以 16用十六进制表示为 0x10 或者 0X10 。与之相似,前缀0(零)表示使用八进制。例如 十进制数16 用八进制表示为 020 。关于进制,会在第15章详细介绍。

要清楚,这种使用不同数制系统的选择是为了方便而提供的,它并不影响数字的存储。无论,16,020还是 0x10,数字都按照同样的方式,即计算机内部使用的二进制编码进行存储。


六. 显示八进制数和十六进制数

C既允许你使用 3种数制书写数字也允许以这 3种数制显示数字。要用八进制而不是十进制显示数字,请用%o (字母o)。要显示十六进制整数,请使用 %x 。如果想显示 C语言前缀,可以使用说明符 %#o, %#x 和 %#X 分别生成 0,0x,0X 前缀。程序清单 3.3是一个简单的例子

程序清单 3.3 bases.c 程序
-------------------------------------------------------------------------------------
/* bases.c -- 以十进制,八进制和十六进制形式输出 100 */
#include <stdio.h>
int main (void)
{
int x = 100;
printf ("dec = %d; octal=%o; hex=%x\n",x,x,x); //dec 十进制,octal 八进制, hec 十六进制
printf ("dec = %d; octal=%#o; hex=%#x\n",x,x,x);
getchar();
return 0;
}

编译并运行上面的程序,将产生下列输出
dec = 100; octal = 144; hec = 64;
dec = 100; octal = 0144; hec = 0x64

程序用 3种不同的数制系统显示同一个值。printf()函数做了相关的转换。注意,要显示 0 和 0x前缀,必须在说明符中加入 #符号。
---------------------------------------------------------------------------------------

3.4.2 其他整数类型

初学语言时,int类型会满足你对整数的大多数需求。但为了给出完整的介绍,现在我们将讨论其他类型。你也可以跳过本节,直接阅读“使用字符:char类型”小节,在以后需要的时候再阅读本节。

C提供 3个附属关键字修饰基本的整数类型:short,long 和 unsigned 。应当记住以下几点:

1. short int类型(或者简写为 short类型)可能占用比 int类型更少的存储空间,用于仅需小数值
的场合以节省空间。同 int类型一样,short类型是一种有符号类型。

2. long int类型(或者简写为 long类型)可能占用比 int类型更多的存储空间,用于使用大数值的场 合。同 int类型一样,long类型是一种有符号类型。

3. long long int 类型(或者简写为 long long类型)(都是在C99标准中引入的),可能占有用比
long更多的存储空间,用于使用更大数值的场合。同 int类型一样,long long类型是一种有符号
类型

4. unsigned int类型(或者简写为 unsigned类型)用于只使用非负值的场合。这种类型同有符号的表 示范围不同。例如,16位的unsigned int 取值范围为 0 到65535,而带符号 int的取值范围为
-32768 到 32767. 由于指示数值正负的位也被用于二进制位,所以无符号数可以表示更大的数值。

5. 在 C90标准中,还允许 unsigned long int (简写 unsigned long)和 unsigned short int 
(简写 unsigned short)类型。 C99又增加了 unsigned long long int(简写为 unsigned 
long long)类型。

6. 关键字 signed 可以和任何有符号类型一起使用,它使数据的类型更加明确。例如:short,
short int, signed short 以及 signed short int 代表了同一种类型。


一. 声明其他整数类型

其他整数类型的声明方式同 int类型相同,下面是一些例子。一些早期的 C语言编译器不识别最后 3条语句,最后一条语句由 C99标准最新引入。

long int estine;
long johns;

short int erns;
short ribs;

unsigned int s_count;
unsigned players;

unsigned long headcount;
unsigned short yesvotes;

long long ago;


二. 使用多种整数类型的原因

为什么说 long 和 short类型“可能”占用比 int 类型更多或者更少的存储空间呢?因为 C仅保证 short 类型不会比 int类型长,并且 long类型不会比 int类型短。这样做是为了适应不同的机器。例如,在一台运行 Windows 3.1的 IBM PC上,short类型和 int类型都是 16位,long类型是 32位。而在一台 Windows XP机器或 Macintosh PowerPC 上, short类型是 16位,int类型和 long类型都是 32位。Pentium 芯片 和 PowerPC G3或 G4芯片的自然字大小都是 32位,这使整数可以表示大于 20亿的数。在以上处理器和操作系统的组合中实现 C时,实现都认为没有表示更大数的需要,因此 long类型使用和 int类型同样的长度。很多场合不需要这么大的整数,因而创建了更节省空间的 short类型。另一方面,早期的 IBM PC中字长只有 16位,这意味着在它上面的 C实现需要比 int类型更大的 long类型。

现在 64位处理器,如IBM Itanium, AMD Opteron 和 Power PC G5 正变得越来越普遍,需要 64位的整数,因而引入 long long 类型。

目前一般的情况是,long long类型为64位,long类型为 32位,short类型为 16位,int类型为 16位或 32位(依机器的自然字大小而定)。但原则上,这 4种类型代表 4个不同大小的值。

C 语言标准规定了每种基本数据类型的最小取值范围,对应于 16位单位,short类型 和 int类型的最小取值范围为 -32767 到 32767;

对应于 32位单位,long类型的最小取值范围为 -2147483647 到2147483647(注意,为了便于理解,这里使用了逗号,但是在 C代码中不允许这样)。

对于 unsigned short类型 和unsigned int类型,最小取值范围为 0 到 65535;

对于 unsigned long类型,最小取值范围为 0到 4294967295。

long long类型是为了支持 64位的需求,最小取值范围是数目可观的 -9223372036854775807 到
9223372036854775807;

unsigned long long 类型的最小取值范围为 0到 18446744073709551615.

在诸多整数类型中选择哪一种呢?请首先考虑 unsigned类型。把这种类型用于计数是十分自然的事,因为此时你不需要负数,而且无符号类型可以取得比有符号类型更大的正数。

当使用 int类型不能表示一个数而使用 long类型可以做到时,使用 long类型。但是,在 long类型大于 int类型的系统中,使用 long类型会减慢计算,所以没有必要时不要使用 long类型。如果是在 long类型等于 int类型的系统中编写代码,当确实需要 32位整数时,就使用long类型(而不是 int类型)以便使程序被移植到 16位机器上后仍然可以正常工作。

与之类似,如果需要 64位整数,你应使用 long long类型。一些计算机已经使用了 64位处理器,并且 64位的服务器,工作站甚至桌面系统不久将十分普遍。

在 int 为32位的系统上,如果需要 16位的值,那么使用 short类型可以节省存储空间。通常,只有当程序使用了使系统可用内存很紧张的较大的整数数组时,节省存储空间才是重要的。使用 short类型的另一个原因是计算机中的一些硬件寄存器是 16位的。


----------------------------------------------------------------------------------
ps : 整数溢出

如果整数太大,超出了整数类型的范围会怎么样?下面分别将有符号类型和无符号类型整数设置为最大允许值加略大一些的值,看看结果是什么(printf()函数使用 %u 说明符显示 unsigned int类型的值)。

/* toobig.c --- 超出你系统上最大 int 值 */
#include <stdio.h> 
int main (void)
{
int i = 2147483647;
unsigned int j = 4294967295;

printf ("%d %d %d \n", i,i+1,i+2);
printf ("%u %u %u \n",j,j+1,j+2);
getchar();
return 0;
}

下面是我们使用的系统的结果:
2147483647 -2147483648 -2147483647
4294967295 0 1

无符号整数 j 像一个汽车里程指示表,当达到最大值时,它将溢出起始点。 整数 i 也是同样。他们主要的区别是 无符号变量 j 的起始点是 0, 而 int 变量 i 的起始起点则是 -2147483648 。注意
当 i 超过(溢出)它的最大值时,系统并没有给出提示,所以编程时你必须自己处理这个问题。

这里描述的现象由 C中关于无符号类型的规则所操纵, C标准没有定义有符号类型的溢出规则。这里的现象是比较有代表性的,但你也可能遇到不同的情况。

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

三. long常量和 long long常量

通常,在程序代码中使用 2345这样的数字时,它以 int类型存储。当使用 1000000 这样的数字 int类型不能表示时,编译器会视其为 long int类型(假定这种类型可以表示该数字)。如果数字大于 long 类型的最大值,C 会视其为 unsigned long类型。如果仍然不够,C 会视其为 long long类型或者 unsigned long long 类型(如果有这些类型的话)。

八进制和十六进制常量通常被视为 int类型。如果值过于大,编译器会试用 unsigned int,如果不够在,编译器会依次试用 long, unsigned long, long long 和 unsigned long long 类型。

有时候你也许会希望编译器用 long类型来存储一个较小的整数。例如,在编程中涉及到显式使用 IBM PC上的内存地址时,就是会产生这样的需求。一些标准的 C函数也需要 long类型的值。如果希望把一个较小的常量作为 long类型对待, 可以使用 l (小写的L)或 L后缀。使用 L后缀是更好的选择,因为 l同数字 1很相近。这样,在 int类型为 16位,long类型为 32位的系统中,会把整数 7作为 16位数存储,而把整数 7L作为 32位数存储。 l和 L后缀对八进制和十六进制数同样适用,比如 020L
0x10L。

与之类似,在支持 long long 类型的系统中,可以使用 ll 或 LL后缀标识 long long 类型值,比如 3LL。 u 或 U后缀用于标识 unsigned long long 类型值,比如 5ull ,10LLU, 6LLU 和 9Ull。


四. short,long,long long 和 unsigned 类型数

要打印 unsigned int 数字,可以使用 %u符号,打印 long数值,可以使用 %ld格式说明符。如果系统 int 和 long类型具有同样的长度,使用 %d就可以打印 long数值,但是这会给程序移植到其他系统(这两种数据类型的长度不一样的系统)带来麻烦,所以建议使用 %ld打印 long数值。 在 x 和 o 符号前也可以使用 l 前缀, 因此 %1x表示以十六进制格式打印长整数, %lo表示以八进制打印长整数。请注意,尽管在 C中常量后缀可以使用大写和上写,但格式说明符只能使用小写字母。

C 还有其他几种 printf()格式。首先,可以对 short 类型使用 h前缀,因为 %hd表示以十进制显示 short整数,%ho表示以八进制显示 short整数。 h 和 l 前缀都可以同 u 结合使用以表示无符号类型。 比如, %lu表示打印 unsigned long 类型。 程序清单 3.4给出了一个例子。支持 long long类型的系统使用 %lld 和 %llu分别表示有符号类型和无符号类型。 第4章将详细介绍格式说明符。


程序清单 3.4 print2.c程序
-----------------------------------------------------------------------
/* print2.c -------------printf()的更多属性 */
#include <stdio.h>
int main (void)
{
unsigned int un = 3000000000; // int 为32位
short end = 200; // short 为 16位的系统
long big =65537;
long long verybig = 12345678908642;
printf ("un=%u and not %d\n",un,un);
printf ("end=%hd and %d\n",end,end);
printf ("big=%ld and not %hd\n",big,big);
printf ("verybig=%lld and not %ld\n",verybig,verybig);
getchar();
return 0;
}

下面是在某系统上的执行结果
un = 3000000000 and not - 1294967296
end = 200 and 200
big = 65537 and not 1
verybig = 12345678908642 and not 1942899938

这个例子就表明如果使用了不正确的说明符,会造成意想不到的后果。首先,对无符号变量 un使用 %d说明符会导致显示负值!这是由于在程序运行的系统中,无符号数 3000000000 和有符号数 -1294967296在内存中的表示方法是一样的 (详见第 15章。)所以,如果告诉 printf()函数该数值是无符号的,它将打印某个值,而如果告诉 printf()函数该数值是有符号的,它将打印另外一个值。在数值大于有符号类型最大值的时候会发生这种情况。对于小一些的正数(比如 96),有符号和无符号类型的存储和显示都是相同的。

其次,不论使用 %hd 还是 %d,short类型变量 end的显示结果相同。这是因为在传递函数参数时 C自动将 short类型的值转换为 int类型。这会在你的脑子里引起两个疑问:为什么要进行这样的转换?
h 修饰符的用处是什么? 第一个问题的答案是:int 类型被认为 计算机处理起来最方便有效的整数类型,所以在 short类型和 int类型长度不同的系统中,使用 int类型值进行参数传递的速度更快;第二个问题的答案是:可以使用 h修饰符显示一个较长的整数被截为 short 类型值时的样子。输出的第三行就演示了这一点。把值 65537按照二进制格式写一个32位的数字时,它应该是 0000000000000001
0000000000000001 。在 printf()中使用 %hd说明符将使它只显示后 16位,即显示值 1。

与此类似,最后一行输出先昧了 verybig 变量的完整值,然后通过使用 %ld说明符显示了存储在它的后32位中的值。

前面你已经认识到应该确保说明符的数目与要显示的值的数目相匹配。这里说明了还必须根据要显示的值的类型来选用正确的说明符。
--------------------------------------------------------------------------------

posted @ 2017-05-08 18:59  sheldon_lee  阅读(203)  评论(0编辑  收藏  举报