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

  • 1
  • 0
  • 约2.78千字
  • 约 3页
  • 2019-01-14 发布于河北
  • 举报

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

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

C语言中的整型数据类型转换以及格式化输出问题 先附上两张图片 Printf()函数的格式转换参数 各数据类型的长度和表示范围 首先我们来谈整型数据的转换问题,不同类型的整型数据所占的字节数不同,在转换时需要格外留心。 分为两种情况: 第一种情况为将所占字节大的类型数据转换为所占字节小的类型数据,这种情况下只需要截取合适位数的大字节的类型数据到小字节类型数据中即可,例如:unsigned short a=256;char b=a; 则b中的数据截取了a的低八位。 第二种情况为将所占字节小的类型数据转换为所占字节大的类型数据,这种情况下需要涉及到扩展问题,所谓扩展分为两种情况,当需要扩展的小类型数据为有符号数时,即将过小数据的最高位即符号位复制到扩展的位上,比如一个char类型的数据char a=128,二进制表则将其转换为整型数据b即int b=a,相应的b即为1…又或者一个char类型数据127,二进制表则将其转换为整型数据b相应的b即为0….当需扩展的小类型数据为无符号数时,扩展位为全部为0。 另外对于同等大小的不同数据类型之间转换,则是相应的二进制码全额复制。 下面我们来讨论%d和%u的格式化输出问题 我们都知道%d表示输出十进制有符号整数,然而很少有人会注意到%d表示的格式类型其实相当于int类型,即有符号整型数据,占用4个字节,最高位表示符号位,输出的范围在-2147483648到2147483647间。 当我们在用%d输出数据是需要注意类型间的转换问题的。 不同类型的整型数据所占的字节数不同,在转换时需要格外留心,因为%d表示的4字节数据占用字节数最大,所以在输出过程中一般要么是将过小的数据转换成过大的数据输出,要么是同大小的数据输出。 对于同大小的数据输出不涉及扩展问题;而对于将过小的数据转换成过大的数据输出,则涉及到扩展问题。 所谓扩展分为两种情况,当需要扩展的小数据为有符号数时,即将过小数据的最高位复制到扩展的位上,比如一个char类型的数据128,二进制表用%d来输出则其自动扩展到4字节即前三个字节全部为1,又或者一个char类型数据127,二进制表用%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的二进制码输出时扩展后变为1自然会按补码形式输出相应的负数-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,原因为计算机中存储

文档评论(0)

1亿VIP精品文档

相关文档