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

unsigned short a=-1;
printf("%d",a); //输出65535
unsigned int a=-1;
printf("%d",a);//输出-1
以上为什么两者不一致呢,前者输出正值,后者为何是负值?

因为short和int型占的字节数不一样,一般来说,int占四个字节,short占两个字节(不同的系统分配的字节数不一样)。他们是以二进制数存放在内存中的。你把-1赋给short型的a,输出的时候,只取了后面的两个字节的内容,那个负号在前两个字节中。你把-1赋给int型的a时,输出的时候,取了四个字节的内容,所以负号也被输出了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-22
计算 位数有 short int long 几个类型 short<=int<=long
例如16位的int输出为-32768到32767
unsigene int 就为0到65535
就像一个轮盘一样 转满一圈会溢出也就是-1=65535 65536=0
第2个回答  2013-03-22
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。本回答被提问者采纳
第3个回答  2013-03-22
输出无符号要用u;
printf("%u",a);追问

这个我知道,我只是不明白,为什么同样用%d,结果却一个正,一个负呢?

追答

我觉得printf的%d是按int类型的,你用short 的-1在内存中会映射到int类型会变为65535。
而int类型的-1 就没有这个问题。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网