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 ", x+y); 11 } 12 return 0; 13 }
你会发现当要输出负数时,输出的却是一个很奇怪的正数;
通过这道题我才发现了“有符号数的输出”和“无符号数的输出”的差别。
首先先知道哪些是“无符号数”,哪些是“有符号数”:
%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 ", x+y); 13 } 14 else 15 { 16 printf("-%llX ", -(x+y)); 17 } 18 } 19 return 0; 20 }