C语言中的整型数据类型转换以及格式化输出问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言中的整型数据类型转换以及格式化输出问题

先附上两张图片

i.

Printf()函数的格式转换参数

ii.

各数据类型的长度和表示范围

首先我们来谈整型数据的转换问题,不同类型的整型数据所占的字节数不同,在转换时需要格外留心。

分为两种情况:

第一种情况为将所占字节大的类型数据转换为所占字节小的类型数据,这种情况下只需要截取合适位数的大字节的类型数据到小字节类型数据中即可,例如:unsigned short a=256;char b=a; 则b中的数据为00000000,截取了a的低八位。

第二种情况为将所占字节小的类型数据转换为所占字节大的类型数据,这种情况下需要涉及到扩展问题,所谓扩展分为两种情况,当需要扩展的小类型数据为有符号数时,即将过小数据的最高位即符号位复制到扩展的位上,比如一个char类型的数据char a=128,二进制表示10000000,则将其转换为整型数据b即int b=a,相应的b即为1….10000000,又或者一个char类型数据127,二进制表示01111111,则将其转换为整型数据b相应的b即为0…. 01111111;当需扩展的小类型数据为无符号数时,扩展位为全部为0。

另外对于同等大小的不同数据类型之间转换,则是相应的二进制码全额复制。

下面我们来讨论%d和%u的格式化输出问题

我们都知道%d表示输出十进制有符号整数,然而很少有人会注意到%d表示的格式类型其实相当于int类型,即有符号整型数据,占用4个字节,最高位表示符号位,输出的范围在-2147483648到2147483647间。

当我们在用%d输出数据是需要注意类型间的转换问题的。

不同类型的整型数据所占的字节数不同,在转换时需要格外留心,因为%d表示的4字节数

据占用字节数最大,所以在输出过程中一般要么是将过小的数据转换成过大的数据输出,要么是同大小的数据输出。

对于同大小的数据输出不涉及扩展问题;而对于将过小的数据转换成过大的数据输出,则涉及到扩展问题。

所谓扩展分为两种情况,当需要扩展的小数据为有符号数时,即将过小数据的最高位复制到扩展的位上,比如一个char类型的数据128,二进制表示10000000,用%d来输出则其自动扩展到4字节即前三个字节全部为1,又或者一个char类型数据127,二进制表示01111111,用%d来输出则自动扩展到4字节即前三个字节全部为0;另一种情况当需扩展的数据为无符号数时,扩展位为全为0。

然后printf()函数按照扩展的数据原码输出正数或数据补码输出负数。

给几个例子自己思考:

如:int b=2147483648;

printf("%d\n",b); (同大小类型无需扩展)

输出的是-2147483648,原因即为计算机中保存的b的二进制码为100…..00,其为补码形式输出自然为负数,相应的当b的值小于2147483648时,输出全为正数原值,大于2147483648时输出全是补码负值。

又如:char b=128; (char类型扩展时当做有符号数)

printf("%d\n",b); (小类型转大类型需扩展)输出结果为-128,原因即为计算机中保存的b的二进制码为10000000,输出时扩展后变为1…10000000,自然会按补码形式输出相应的负数-128。

又如:unsigned short a=32768;

printf("%d\n",a);

输出32768;而:short a=32768;

printf("%d\n",a);

输出-32768,原因即为无符号的short类型扩展为全是0,而有符号的short类型扩展为以其符号位而定。

关于其他形式均可类推。

%u表示十进制无符号整数,然而很少有人会注意到%u表示的格式类型其实相当于unsigned (int)类型,即无符号整型数据,同样占用4个字节,不过没有符号位,4字节全表示数值,范围在0到4294967295之间,%u输出时的类型转换问题与%d类似,涉及扩展问题,不过不涉及到正负数原码补码的问题,因为%u输出的全是非负数。

用%u输出数据,若输出的数据为有符号数,按符号位执行扩展,若输出的数据为无符号数,则扩展为全为0。

给几个例子自己思考:

如:int b=-128;

printf("%u\n",b);

输出4294967168,原因为计算机中存储的b的二进制码为11…10000000,用%u输出大小自然为232-27。

又如:short b=128;

printf("%u\n",b);

输出128,原因是计算机中存储的b的二进制码为0000000010000000,扩展后为

00…10000000,用%u输出大小仍为128。

又如:short b=32768;

printf("%u\n",b);

输出为4294934528,原因是计算机中存储的二级制码为1000000000000000,扩展后为11...1000000000000000,用%u输出大小为232-215。

综上可知无论是%d还是%u,在输出数据时第一步是要进行类型转换,根据要输出的数据的类型大小以及有无符号来进行相应的扩展,扩展完毕后,再根据是%d输出还是%u输出来把扩展后的二进制码当成原码或补码来输出正数和负数。

给个例子:char b=128; //b二进制代码10000000

short a=b; //a二进制代码1111111110000000

printf("%d\n",a); //转换后的二进制代码11…10000000按补码输出负值

输出结果为-128。

再给个例子:char b=128;//b二进制代码10000000

unsigned short a=b; //a二进制代码1111111110000000

printf("%d\n",a); //转换后的二进制代码00…1111111110000000按原码码输出正值

输出结果是65408。

相关文档
最新文档