转换不匹配

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#define PAGSS 336
#define WORDS 65618
int main()
{
	short num = PAGSS;
	short mnum = -PAGSS;
	printf("%hu\n",mnum);
	printf("%c\n", num);
	printf("%hd,%c\n", WORDS ,WORDS);
	return 0;
}

运行结果:

65200
P
82,R

第一行mnum变量对应的转换说明是%hu(无符号),打印的结果并非336,而是65200,这是由于short类型的值在参考系统的表示方式所致。首先short(取值范围:-32768~32767)类型的大小是两字节,系统用二进制的补码表示有符号整数,这种方法,数字0~32767代表他本身,而数字32767~65535表示负数,其中65535为-1,65534为-2,以此类推,-336表示为65200(65536-336)所以被解释成有符号的int时65200代表-336.

第二行演示了把一个大于25的数转换成字符会发生什么情况。在我们的系统中,short是2字节,char是1字节。使用%c打印336时,他只会查看储存336的两字节的后1字节,这种截断相当于用一个整数除以256,只保留余数,在这种情况下,余数是80,80在ascll码表中对应p。用专业术语来说该数字被解释成“以256为模”(modulo 256),即该数除以256后的余数。

最后我们打印比short类型最大整数(32767)更大的数(65618),这里也同样运用了求模运算,在本系统中,65618应被存为四个字节,用%d时,只使用了后两个字节,这相当于65618除以65536的余数,这里的余数是82,鉴于负数的储存方法,如果余数在32767~65535之间会被打印成负数。

对于不同的系统,处理的行为类似,但产生的值可能不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值