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
以上为什么两者不一致呢,前者输出正值,后者为何是负值? 展开
printf("%d",a); //输出65535
unsigned int a=-1;
printf("%d",a);//输出-1
以上为什么两者不一致呢,前者输出正值,后者为何是负值? 展开
4个回答
展开全部
计算 位数有 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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
输出无符号要用u;
printf("%u",a);
printf("%u",a);
追问
这个我知道,我只是不明白,为什么同样用%d,结果却一个正,一个负呢?
追答
我觉得printf的%d是按int类型的,你用short 的-1在内存中会映射到int类型会变为65535。
而int类型的-1 就没有这个问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询