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不区分大小写
1 #include<stdio.h> 2 int main() 3 { 4 __int64 a, b, sum; 5 while(scanf("%I64X %I64X", &a, &b)!=EOF) 6 { 7 sum=a+b; 8 if(sum<0) 9 { 10 sum=-sum; 11 printf("-"); 12 } 13 printf("%I64X ", sum); 14 } 15 return 0; 16 }
// 补充->补码
计算机中的符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用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
转化为原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“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)