There must be many A + B problems in our HDOJ , now a new one is coming.
Give you two hexadecimal integers , your task is to calculate the sum of them,and print it in hexadecimal too.
- Easy ? AC it !
- Input
The input contains several test cases, please process to the end of the file.
Each case consists of two hexadecimal integers A and B in a line seperated by a blank.
The length of A and B is Less than 15.
- Output
- For each test case,print the sum of A and B in hexadecimal in one line.
- Sample Input
- +A -A
- +1A 12
- 1A -9
- -1A -12
- 1A -AA
- Sample Output
- 0
- 2C
- 11
- -2C
- -90
- // printf 函数中 %x,%X 区分大小写, 且输出无符号整数(不输出前缀 0x,0X)
- // scanf 函数中 %x,%X 不区分大小写
- #include<stdio.h>
- int main()
- {
- __int64 a, b, sum;
- while(scanf("%I64X %I64X", &a, &b)!=EOF)
- {
- sum=a+b;
- if(sum<0)
- {
- sum=-sum;
- printf("-");
- }
- printf("%I64X\n", sum);
- }
- return 0;
- }
- View Code
- // 补充 ->补码
计算机中的符号数有三种表示方法, 即原码, 反码和补码.
三种表示方法均有符号位和数值位两部分, 符号位都是用 0 表示 "正", 用 1 表示 "负"(0 有两种表示:+0 和 - 0),
而数值位, 三种表示方法各不相同.
正数
正整数的补码是其二进制表示, 与原码相同.
[例 1] +9 的补码是 00001001.
备注: 这个 + 9 的补码是用 8 位 2 进制来表示的.
补码表示方式很多, 同一个数字在不同的补码表示形式中是不同的. 除了 8 位 2 进制, 还有 16 位二进制补码表示形式, 以及 32 位二进制补码表示形式, 64 位进制补码表示形式等. 每一种补码表示形式都只能表示有限的数字.
负数
求负整数的补码, 将其原码除符号位外的所有位取反 (0 变 1,1 变 0, 符号位为 1 不变) 后加 1.
[例 2] 数 0 的补码表示是唯一的.
[+0]补 =[+0]反 =[+0]原 = 00000000
[-0]补 = 11111111+1=00000000
转化为原码
已知一个数的补码, 求原码的操作其实就是对该补码再求补码:
1如果补码的符号位为 "0", 表示是一个正数, 其原码就是补码.
2如果补码的符号位为 "1", 表示是一个负数, 那么求给定的这个补码的补码就是要求的原码.
[例 4] 已知一个补码为 11111001, 则原码是 10000111(-7).
因为符号位为 "1", 表示是一个负数, 所以该位不变, 仍为 "1".
其余七位 1111001 取反后为 0000110; 再加 1, 所以是 10000111.
补码的绝对值
[例 5] -65 的补码是 10111111
若直接将 10111111 转换成十进制, 发现结果并不是 - 65, 而是 191.
事实上, 在计算机内, 如果是一个二进制数, 其最左边的位是 1, 则我们可以判定它为负数, 并且是用补码表示.
若要得到一个负二进制补码的数值, 只要对补码全部取反并加 1, 就可得到其数值.
如: 二进制值: 10111111(-65 的补码)
各位取反: 01000000
加 1:01000001(+65)
来源: http://www.bubuko.com/infodetail-2947286.html