我需要将长十进制数转换为14245138929982432 in到其值为329BE0DDB29BE0的十六进制值.
但是,当我尝试使用下面的代码时,我得到的结果为FFFFFFFF.
$l_KeyExpected_UL=14245138929982432;
$hexadeci = sprintf '%X', $l_KeyExpected_UL;
print $hexadeci."\n";\
Run Code Online (Sandbox Code Playgroud)
可以请任何人帮忙.
你可以使用该Math::BigInt模块,它完成了bigintpragma 背后的所有繁重工作
您不能使用sprintfunder bigint将大小数转换为十六进制,因为它的转换不会重载,但Math::BigInt对象有一个as_hex方法,它返回表示为十六进制字符串的数字,前缀为0x
此程序将转换包装在子例程中bigint_to_hex,该子例程删除0x前缀并将小写更改为大写
现在遇到无法处理64位值的Perl安装是不寻常的.但是这个方法适用于任何十进制字符串,正如我通过转换1.2E40的值以及问题中的值所证明的那样
将大整数作为字符串传递至关重要,因为如果数字文字超过普通整数的宽度,它们将被编译器转换为浮点数.我的程序还打印相同的1.2E40值的十六进制等效值,不带引号,以便您可以看到差异
use strict;
use warnings 'all';
use feature 'say';
use Math::BigInt;
my $l_KeyExpected_UL = '14245138929982432';
say bigint_to_hex($l_KeyExpected_UL);
say bigint_to_hex('12345678901234567890123456789012345678901');
say bigint_to_hex(12345678901234567890123456789012345678901);
say bigint_to_hex(1.2E40);
sub bigint_to_hex {
my $hex = Math::BigInt->new(shift)->as_hex;
$hex =~ s/^0x//;
uc $hex;
}
Run Code Online (Sandbox Code Playgroud)
329BE0DDB29BE0
2447DB449988978536BF5BBBE40E766C35
2447DB449988B214BEA48F651CA8000000
2343CBEEEA6F2C193478C00E0000000000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |