HDU -- A+B Again(无符号数的负数输出)

http://acm.hdu.edu.cn/showproblem.php?pid=2057

WA 代码:

 1 /* */
 2 # include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     long long int x, y;
 8     while( ~ scanf("%llX %llX", &x, &y) )
 9     {
10         printf("%llX\n", x+y);
11     }
12     return 0;
13 }
View Code

你会发现当要输出负数时,输出的却是一个很奇怪的正数;

通过这道题我才发现了“有符号数的输出”和“无符号数的输出”的差别。

首先先知道哪些是“无符号数”,哪些是“有符号数”

%d 十进制有符号整数

%md,m指定的是输出字段的宽度,如果数据的位数小于m,则左端补以空格,若大于m,则

  按实际位数输出,如:

  printf("%4d,%4d",a,b)

  若a=123,d=12345,则输出的结果为:

  空格123,12345

%ld输出长整形格式(有符号
%u 十进制无符号整数 
%f 浮点数 
%s 字符串 
%c 单个字符 
%p 指针的值 
%e 指数形式的浮点数 
%x, %X 无符号以十六进制表示的整数 
%o %O 无符号以八进制表示的整数 
%g 自动选择合适的表示法

有符号 与 无符号 的 正数 输出无区别,直接输出

                               负数有区别了:有符号的负数也可以直接输出

                                                        无符号的负数要把它变成正数,然后输出“-”号 和 正数;

计算机存储的时候是以补码存数的,输出以原码的形式输出! 
比如: -1 (32位模式) 
存: 
1 000000000000000000000000000000 1<原> 
1 111111111111111111111111111111 0<反-注意第一位是符号位不变> 
1 111111111111111111111111111111 1<补> 
输:<以有符号数输出且是负数 那么原码=补码再求补;其余输出原码=[补码]> 
以%d形式<这是有符号数输出且是负数>: 
1 111111111111111111111111111111 1<补> 
1 000000000000000000000000000000 0<反> 
1 000000000000000000000000000000 1<原> 
第一为符号位为1 表示-,所以输出-1

以%x形式:<这是无符号数>: 
1 111111111111111111111111111111 1<补> 
1 111111111111111111111111111111 1<原> 
不考虑符号所以,输出FFFFFFFF。

 

AC代码:

 1 /* */
 2 # include <bits/stdc++.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     long long int x, y;
 8     while( ~ scanf("%llX %llX", &x, &y) )
 9     {
10         if( x+y>=0 )
11         {
12             printf("%llX\n", x+y);
13         }
14         else
15         {
16             printf("-%llX\n", -(x+y));
17         }
18     }
19     return 0;
20 }
View Code

 

posted @ 2019-02-16 16:40  swsyya  阅读(198)  评论(0编辑  收藏  举报

回到顶部