在C中:
printf ("%u", 17860374324089702869);
打印“3336554965”(这是我想要的答案!)
在perl中,同一行代码显示为“17860374324089702869”。
我怎样才能从“17860374324089702869”中获得perl来产生“3336554965”。
我的直觉说这是64位与32位的问题,但似乎perl语句对数字没有任何作用。
最佳答案
在C语言中,printf
%u
采用unsigned int
。这是32位还是64位的值或完全不同的值完全取决于您的C实现。该标准仅要求int
至少为16位宽。 (由于您在示例中传递的值不适合unsigned int
,因此我很确定您的代码具有 undefined 的行为:您没有像预期的那样将unsigned int
传递给%u
。)
在Perl中,%u
将其参数转换为无符号整数。该整数的宽度取决于Perl的编译方式。它通常是32位或64位类型。您可以通过运行perl -V:uvsize
(Perl的无符号整数类型的大小,以字节为单位)和perl -V:uvtype
(相应的C类型)来查询perl的配置详细信息。
如果要将值显式地截断为32位,最简单的方法可能是应用位掩码:
use constant { UINT32_MAX => 0xffff_ffff };
print 17860374324089702869 & UINT32_MAX, "\n";
然后,您也不需要
printf
。关于c - c和perl之间的printf差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56778821/