C语言中有无符号类型的输出问题

unsignedshorta=-1;printf("%d",a);//输出65535unsignedinta=-1;printf("%d",a);//输出-1以上为什么两... unsigned short a=-1;
printf("%d",a); //输出65535
unsigned int a=-1;
printf("%d",a);//输出-1
以上为什么两者不一致呢,前者输出正值,后者为何是负值?
展开
 我来答
太阳雨1989
2013-03-22 · TA获得超过2779个赞
知道小有建树答主
回答量:307
采纳率:100%
帮助的人:71万
展开全部
因为short和int型占的字节数不一样,一般来说,int占四个字节,short占两个字节(不同的系统分配的字节数不一样)。他们是以二进制数存放在内存中的。你把-1赋给short型的a,输出的时候,只取了后面的两个字节的内容,那个负号在前两个字节中。你把-1赋给int型的a时,输出的时候,取了四个字节的内容,所以负号也被输出了。
予所否者
2013-03-22
知道答主
回答量:32
采纳率:0%
帮助的人:5.8万
展开全部
计算 位数有 short int long 几个类型 short<=int<=long
例如16位的int输出为-32768到32767
unsigene int 就为0到65535
就像一个轮盘一样 转满一圈会溢出也就是-1=65535 65536=0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackwind1987
2013-03-22 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:491万
展开全部
unsigned short xx = -1;

printf("%d", xx);
unsigned int yy = -1;
printf("%d", yy);
这段代码编译成汇编之后得到如下代码
call ___main
movw $-1, 26(%esp)
movzwl 26(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf // 第一个printf

movl $-1, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf // 第二个printf
注意两个printf调用之前的两端代码,不同之处在于将-1传递给printf的时候的数据传递指令
第一个用的是movzwl 第二个用的是movl
movzwl是将16位的数据拷贝到32位的低16位空间中,并且高位16未补0

这样不难得出,最后传到printf里面的数字假设是M,它的高16位是0,低16为都是1,解释为int就是65535了。
而movl都是同样的32位操作,所以没有任何转化,结果还是-1。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
temp2000
2013-03-22 · TA获得超过483个赞
知道小有建树答主
回答量:564
采纳率:100%
帮助的人:351万
展开全部
输出无符号要用u;
printf("%u",a);
追问
这个我知道,我只是不明白,为什么同样用%d,结果却一个正,一个负呢?
追答
我觉得printf的%d是按int类型的,你用short 的-1在内存中会映射到int类型会变为65535。
而int类型的-1 就没有这个问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式