2017-02-14 11 views
0

У меня есть следующая операция в PHP:Почему разные результаты в той же операции? PHP е C#

24733 * 0x41c64e6d + 0x6073;

... и результат: 27293242579276

С той же логикой, я проделать ту же операцию в C#:

24733 * 0x41c64e6d + 0x6073;

Но результат: -1274586804

OMG, почему?

+2

потому что целое переполнение – Steve

+1

Math overflow. Чтобы решить использовать более крупный тип данных в C#. –

+1

try 24733m * 0x41c64e6d + 0x6073 – Steve

ответ

2

по умолчанию C# обрабатывает номер как int, если не указано явное преобразование.

поэтому 24733 рассматривается как int.

int x int + int = int 

и Макс ИНТ 2147483647, который является способом меньше 27293242579276. Это привело к целочисленным переполнением.

Чтобы решить эту проблему, используйте тип с большим числом битов, таких как decimal

вы можете добавить письмо «т» в конце номера, чтобы сказать C# вы хотите, чтобы это было decimal как 24733m * 0x41c64e6d + 0x6073

+1

Итак, кто делает это неправильно? C# или PHP? :) –

+2

@ Raphioly-San оба делают это правильно. Разработчики должны быть единственными, чтобы предотвратить переполнение, поэтому вы делаете это неправильно :) – Steve

+0

Спасибо @Steve! Я новичок на языках среднего уровня. –

0

В PHP вот что происходит

int(24733) * 
int(1103515245) + 
int(24691) 

Вы можете увидеть это, выполнив var_dump значений

В 64-битных сборках максимальное целое число равно 9223372036854775807. Таким образом, PHP может поддерживать предоставленный ответ 27293242579276. На основании другого ответа выглядит, что C# просто преобразует числа по-разному и, возможно, с более низким максимальным целым числом.

+0

Если я правильно понял (исправьте меня, если я ошибаюсь) C# отключит данный номер (из-за проблемы с переполнением) и рассматривать его как 32-разрядное целое число со знаком. Это объясняет отрицательное число, потому что первые 16 бит имеют отрицательное значение, когда это целое число со знаком. –

+0

@ Raphioly-San Имеет смысл. Я не человек C#, поэтому не могу сказать точно – Machavity

Смежные вопросы