乘以十六进制 > uint32> 回到十六进制

Multiply Hex > uint32> back to Hex

我试图找到两个十六进制数(57c9f63e 和 16f77ed6)的乘积(57c9f63e 和 16f77ed6)并将它们打印为无符号 32 位整数,最后将该无符号整数转换回十六进制。

我有一个简短的 python 程序可以将十六进制转换为十进制,我认为我需要将十六进制转换为十进制,然后相乘并找到前面的项目。但是,我不知道从哪里开始,也不知道是否需要结构来完成它。

任何指点将不胜感激。

无需转换 - 您可以读取十六进制或十进制格式的整数,进行乘法运算,然后以十六进制或十进制格式写入输出:

>>> x = input("Gimme a number in hex format: ")
Gimme a number in hex format: 0x57c9f63e
>>> y = input("Gimme a number in hex format: ")
Gimme a number in hex format: 0x16f77ed6
>>> z = y * x
>>> '%d %x' % (z, z)
'567517894676077524 7e03a84b3d85bd4'
>>> type(z)
<type 'int'>

当然这是 Python 2.4.2,而不是 3.x,所以输入可能会有所不同,尽管我很确定 3.x 做类似的事情。前导 0x 是告诉 Python 输入是十六进制格式所必需的。

在C语言中你可以使用十六进制数进行乘法运算。十六进制表示不会造成任何问题。 (0x 基本上是使它成为十六进制表示)。

代码会是这样的

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(){
    uint32_t a = 0x57c9f63e ;
    uint32_t b = 0x16f77ed6 ;
    uint32_t res = a*b;
    if( b && res/b != a){
        printf("%s\n","overflow!!!" );
        exit(1);
    }
    printf("0x%" PRIu32 "\n", res);
    return 0;
}

是的,当我们使用 uint32_t 时会溢出。但是 uint64_t 可以保持结果。

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(){
    uint64_t a = 0x57c9f63e ;
    uint64_t b = 0x16f77ed6 ;
    uint64_t res = a*b;
    if( b && res/b != a){
        printf("%s\n","overflow!!!" );
        exit(1);
    }
    printf("0x%" PRIu64 "\n", res);
    return 0;
}

给出结果,0x567517894676077524