在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/

10-11 23:14
查看更多