Negative 64bit Decimal Number to Binary in php

别说谁变了你拦得住时间么 提交于 2020-01-05 06:38:57

问题


I am trying to convert a decimal number for example

-268427136

to binary and vice versa.

If I try with windows Calc, binary notation for this number is:

1111111111111111111111111111111111110000000000000010000010000000

If I try bindec,decbin or base_convert: echo(decbin(-268427136)); Outputs:

11110000000000000010000010000000

Or echo(bindec('1111111111111111111111111111111111110000000000000010000010000000'); Outputs:

1.84467440734E+19

What could I use in php to achieve same result?


回答1:


Your PHP is probably compiled for 32bit systems resulting in integer overflow and number being represented in 32bit. Ensure that your PHP is compiled for 64bit.

You can check that with

<?php
echo PHP_INT_SIZE;

this should return 8. On my PHP the following works as PHP_INT_SIZE is 8:

php > echo(decbin(-268427136));
1111111111111111111111111111111111110000000000000010000010000000

Background

PHP uses the C language type long to represent integers internally (PHP is written in C). These are platform dependent. On 64bit system usually these are 64bit long. On Windows sometimes applications such as PHP are compiled for 32bit, despite the system supporting 64bit, resulting in long being 32bit or 4byte. Thus you get an overflow which results in a 32bit long number. In your case: 11110000000000000010000010000000

bindec and 64bit numbers

According to the PHP manual, bindec returns a number. As your number is 64bit, PHP interprets it as a float. It calculates the cutoff for using integer or float without the sign. See 2.

php > var_dump(bindec('1111111111111111111111111111111111110000000000000010000010000000'));
float(1.8446744073441E+19)

This can be prevented by explicitly casting to int.

php > var_dump((int)bindec('1111111111111111111111111111111111110000000000000010000010000000'));
int(-268427264)


来源:https://stackoverflow.com/questions/39699613/negative-64bit-decimal-number-to-binary-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!