В С printf
%u
занимает unsigned int
. Является ли это 32-битным или 64-битным значением или чем-то другим, полностью зависит от вашей реализации C Стандарт требует, чтобы ширина int
была не менее 16 бит. (Поскольку значение, которое вы передаете в своем примере, не помещается в unsigned int
, я почти уверен, что ваш код имеет неопределенное поведение: вы не передаете unsigned int
в %u
, как ожидается .)
В Perl %u
преобразует свой аргумент в целое число без знака. Ширина этого целого числа зависит от того, как Perl был скомпилирован; обычно это 32-битный или 64-битный тип. Вы можете запросить информацию о конфигурации вашего perl, запустив perl -V:uvsize
(размер целого типа без знака в байтах Perl) и perl -V:uvtype
(соответствующий тип C).
Если вы хотите явно урезать свое значение до 32 бит, возможно, самый простой способ - применить битовую маску:
use constant { UINT32_MAX => 0xffff_ffff };
print 17860374324089702869 & UINT32_MAX, "\n";
Тогда вам действительно не нужно printf
.