2555600000
слишком велик, чтобы поместиться в 32-разрядное целое число со знаком.Преобразованный в двоичный код, это 10011000 01010011 01011100 10000000
, что означает -0001739367296
, когда интерпретируется как 32-разрядное целое число со знаком.
Ваши параметры:
my $str = sprintf("%014u", 2555600000); # unsigned integer
my $str = sprintf("%014.0f", 2555600000); # floating point
my $str = sprintf("%014s", 2555600000); # string
Первый из них работает для этогономер, но не для гораздо больших чисел.Второй может стать неточным для очень больших чисел.(Но со стандартной плавающей точкой «double» вы должны легко быть точными для 14 цифр, которые вы используете. Третья может быть самой простой, просто трактуйте ее как строку и забудьте, что это число.
Чтобы увидеть, сколько битов использует ваша версия, вы можете запустить perl -V
. Пример вывода:
...
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
...
, поэтому мой Perl использует 4-байтовые 32-битные целые числа.