C语言不匹配转换

转换说明的意义,它把储存在计算机中的二进制格式的数值转换成一系列字符(一个字符串)以便于显示,显然,应该使转换说明与要打印的值的类型相匹配。比如如果想打印一个int类型的值,可以使用%d、%x或%o,所有这些说明符都假定答应一个int类型的值;他们仅仅提供该值不同的表现形式。同样,也可以使用%f、%e或%g来表示double类型的值。

/*intconv.c –一些不匹配的整数转换*/
#include<stdio.h>
#define PAGES 336
#define WORDS 65618
int main(void)
{
short num = PAGES;
short mnum = -PAGES;
printf(“num as short and unsigned short:%hd,%hu\n”,num, num);
printf(“-num as short and unsigned short:%hd,%hu\n”,mnum, mnum);
printf(“num as int and char:%d,%c\n ,num,num”);
printf(“WORDS as int,short,and char:%d,%hd,%c\n”,
WORDS,WORDS,WORDS);
return 0;

}

第一行,我们可以看到%hd和%hu产生336作为变量num的输出,但mnum的%u输出结果则为65200;这是因为short int在系统中的表达方式造成的,首先他们的大小为2字节,其次,该系统使用一种被称为2的补码的方法来表示有符号整数。在这种方法,数字0到32767代表他本身,数字32768到65535则代表负数,65535代表-1,65534代表-2,因此-366由65536-366即65200表示,当解释无符号整数时,65200就是65200.虽然不是所有系统都用这种方法来表示负整数,但有一个准则:不要期望%u转换能把数字和符号分来。

   

第二行,尝试将一个大于255的值转换为字符,在系统上,一个short int占用2个字节,一个char占用1个字节。当printf()使用%c打印336时,他只查看用于存放336两个字节中的一个,这种截断相当于用256除一个整数,并取余,这种情况余数是80,也就是ACSII码值字符 P.

最后,尝试打印一个比系统允许的最大的short int(32767)大的整数(65618),计算机进行模运算,根据数字65618的大小,将他储存为4个字节的整数值。当时用%hd说明打印时,printf()只使用最后两个字节,相当于使用被65536除后得到的余数,这里是82,对应R.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值