给无符号整型 负数值 出现的疑问
发表在C语言图书答疑 2016-08-01
是否精华
版块置顶:
请问:以下两个程序(.c) %d 的输出值,为什么一个用 原值 ,一个用 补码 。

#include<stdio.h>
int main()
{
    unsigned a,b;                    
    a=-5;
    b=-1;
    printf("%d,%d\n",a,b);
    printf("%u,%u\n",a,b);      

    return 0;                      //编译结果是  -5,-1
}                                                4294967291,4294967295



#include<stdio.h>
int main()
{
    unsigned short a,b;
    a=-5;
    b=-1;
    printf("%d,%d\n",a,b);
    printf("%u,%u\n",a,b);

    return 0;                      编译结果是:  65531,65535
}                                                65531,65535
分享到:
精彩评论 8
again
学分:250 LV4
2016-08-01
沙发
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd

佚名
学分:70 LV3
TA的每日心情
开心
2021-07-05 14:21:40
2016-08-01
板凳
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd


[/FIELDSET]

回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
again
学分:250 LV4
2016-08-02
地板
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd


[/FIELDSET]

回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]

这个跟 数据存诸方式和 printf实格式有关,

无论正数,负数 在计算机中都是存的 补码。  
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。


回复:
  
佚名
学分:70 LV3
TA的每日心情
开心
2021-07-05 14:21:40
2016-08-02
4L
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd


[/FIELDSET]

回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]

这个跟 数据存诸方式和 printf实格式有关,

无论正数,负数 在计算机中都是存的 补码。  
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。


回复:
  
[/FIELDSET]

回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
 编译结果是: 65531
again
学分:250 LV4
2016-08-02
5L
[FIELDSET][LEGEND]引自:4楼[/LEGEND]
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd


[/FIELDSET]

回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]

这个跟 数据存诸方式和 printf实格式有关,

无论正数,负数 在计算机中都是存的 补码。  
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。


回复:
  
[/FIELDSET]

回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
 编译结果是: 65531
[/FIELDSET]

回复:

%d 把 a 强制转化为  32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
  
again
学分:250 LV4
2016-08-02
6L
[FIELDSET][LEGEND]引自:5楼[/LEGEND]
[FIELDSET][LEGEND]引自:4楼[/LEGEND]
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。

下面的 unsigned short 类型,正确的输出格式符中 %hu 
short 则是 %hd


[/FIELDSET]

回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]

这个跟 数据存诸方式和 printf实格式有关,

无论正数,负数 在计算机中都是存的 补码。  
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。


回复:
  
[/FIELDSET]

回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
 编译结果是: 65531
[/FIELDSET]

回复:

%d 把 a 强制转化为  32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
  
[/FIELDSET]

回复:
  printf第一个参数,里面是一系统的 %xx 这样的字符串, 这里就指定了后面对应的数据的显示方式。 
佚名
学分:70 LV3
TA的每日心情
开心
2021-07-05 14:21:40
2016-08-02
7L
实在是太谢谢老师啦,嘻嘻,这个知识点完全了解了,谢谢谢谢
again
学分:250 LV4
2016-08-02
8L
[FIELDSET][LEGEND]引自:7楼[/LEGEND]
实在是太谢谢老师啦,嘻嘻,这个知识点完全了解了,谢谢谢谢
[/FIELDSET]

回复:
  不必客气,我也愿意交流。 这也是一个自我提升的过程。 加油!!
首页上一页 1 下一页尾页 8 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照