不匹配的转换

来源:互联网 发布:圣诞布置 知乎 编辑:程序博客网 时间:2024/04/29 12:52

近期通过对c的复习回顾,忽然感到以前学习到的c的知识真是少之又少,比如对于不匹配的转换进行输出时我以前只是知道会输出错误数据,但是对于错误数据的由来却是没有深究。这次通过对c的进一步的复习使我对c有个更深刻的认识。

一,不匹配的转换

   

/*一些不匹配的整数转换*/#include<stdio.h>#define PAGES 336#define WORDS 65618int 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,and char :%d %hd %c\n",WORDS,WORDS,WORDS);return 0;}
结果:/*一些不匹配的整数转换*/

输出结果:

num as short and unsigned short :336 336
-num as short and unsigned short :-336 65200
num as int and char :336 P
WORDS as int,and char :65618 82 R

第一行看到%hd和%hu产生336最为变量num直接输出,没问题。但是第二行中,mnum的%u的输出结果则为65520,而不是我们期望的336,这是因为short int为2个字节,使用2的补码的方法表示有符号的整数,其中0~~32767代表他本身,而数字32768~~65525则代表负数,65535代表-1,65534代表-2……依次类推。因此-336用65535-336,也就是65200表示。所以在被解释成有符号整数时,65200代表-336。

第三行显示试图把一个大于255的值转换成字符输出,由于short占用2字节,char占用1个字节,当输出336时,只能采用截断方式(截断相当于用256除一个整数取余),也就是80.即字符P。

第四行中期望输出比系统允许的最大的short(32767)大的整数(65618),亦是进行模运算,相当于用65536除后取余余数,余数为82,且由于负数的存储方法没在32767~~65536之间的余数会被打印成负数,且余数为82,即字符R。

0 0
原创粉丝点击