gpt4 book ai didi

c - 乘以非常大的十六进制数并用 C 打印它们

转载 作者:行者123 更新时间:2023-11-30 14:33:15 25 4
gpt4 key购买 nike

我想将 2 个非常大的十六进制数字相乘并打印出来,例如:

28B2D48D74212E4F x 6734B42C025D5CF7 = 1068547cd3052bbe5688de35695b1239

因为我预计它是一个非常大的数字,所以我使用了unsigned long long int类型:

unsigned long long int x = 0x28B2D48D74212E4F;   
unsigned long long int y = 0x6734B42C025D5CF7;

并像这样打印乘法:

fprintf(stdout, "%llx\n",  x*y);

我得到的正是预期结果的一半:

5688de35695b1239

为什么它会将其截断为正好一半?有没有比unsigned long long更大的东西?

最佳答案

您要查找的响应不适合 64 位 unsigned long long,这是 64 位平台上的正常大小;乘法期间的任何多余部分都会溢出并丢弃。

较新版本的 GCC 在 64 位机器上支持 128 位整数,并且使用 __int128 (和 unsigned __int128),并且这是有效的:

unsigned long long int x = 0x28B2D48D74212E4FULL;
unsigned long long int y = 0x6734B42C025D5CF7ULL;
unsigned __int128 xy = x * (unsigned __int128)y;

请注意,您必须将 xy 之一转换为更宽的类型,以便以 128 位完成乘法;否则,直到(截断的)64 位乘法之后才会提升到 128。

问题是,据我所知,printf() 没有办法轻松做到这一点,所以你必须自己动手。

这里有一些合理的讨论:how to print __uint128_t number using gcc?

但这对我有用:

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)

#include <stdio.h>

int main()
{
unsigned long long int x = 0x28B2D48D74212E4F;
unsigned long long int y = 0x6734B42C025D5CF7;
unsigned __int128 xy = x * (unsigned __int128)y;

printf("Result = %016llx%016llx\n",
(unsigned long long)( xy >> 64),
(unsigned long long)( xy & 0xFFFFFFFFFFFFFFFFULL));

return 0;

printf 内部的转换非常重要:否则移位/掩码将以 128 位标量完成,并且这些 128 位会被插入堆栈,但随后每个 %llx 需要 64 位。

请注意,这完全取决于底层平台,并且不可移植;肯定有一种方法可以使用各种 #ifdef 和 sizeof 来使其更加通用,但可能没有 super 棒的方法可以让这项工作在任何地方都有效。

关于c - 乘以非常大的十六进制数并用 C 打印它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com