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
例如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。本回答被提问者采纳
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);追问
printf("%u",a);追问
这个我知道,我只是不明白,为什么同样用%d,结果却一个正,一个负呢?
追答我觉得printf的%d是按int类型的,你用short 的-1在内存中会映射到int类型会变为65535。
而int类型的-1 就没有这个问题。