В .NET, что может переполниться, чтобы получить число «-2147479552»? - PullRequest
0 голосов
/ 23 февраля 2012

В .NET, что может переполниться, чтобы привести к int '-2147479552'?

Точное исключение InvalidOperationException составляет

System.InvalidOperationException: значение '0x-2147479552' не может быть преобразовано в System.Int64.

Я предполагаю, что после 0x была строка, приведенная к int, но что это могло быть?

Ответы [ 3 ]

5 голосов
/ 23 февраля 2012

Понятия не имею, это полностью зависит от кода.

Но, что интересно, это число 4096 - 2<sup>31</sup>, поэтому я бы искал число 4096 где-то в базе кода.

И я не уверен, что полностью согласен с вашим комментарием:

то, что следовало за 0x, было строкой, приведенной к int.

Я подозреваю, что это началось как(переполнение) int, приведение к строке, затем префикс 0x перед передачей в Int64.Parse() или что-то подобное.

Почему вы берете число с основанием 10 и добавляете к нему префикс0x немного загадка.

Но, учитывая, что исключение должно предоставить вам номер строки, должна быть возможность оттуда отследить поиск ошибочной операции.

1 голос
/ 23 февраля 2012

Вы уверены, что это был 0x-2147479552?Отрицательный гекс не имеет особого смысла ... Десятичное значение -2147479552 равно 0x80001000, что может быть неудачей при загрузке сборки или модуля.0x80001000 также появляется в ряде других контекстов.Некоторый из нарушающего кода может помочь.

Я нашел один бит кода C, который использует 0x80001000 для обозначения отрицательного переполнения int64

link

 doubleToInt64  (   const double    value,      double *    intDbl,
        BM_STATUS *     bms     )    
 Output
     status = 0x80001000 (negative int64overflow )

Не уверен, что .NET математика использует это соглашение - MSDN notes

OverflowException использует HRESULT COR_E_OVERFLOW, который имеет значение 0x80131516.

InvalidOperation 0x80131509, поэтомуне то, что либо.

1 голос
/ 23 февраля 2012

-2147479552 означает, что ваш int слишком велик.

2 ^ 31-1-4095 = 2147479552

Максимальный размер INT.

Вы не можете преобразовать INT в 64INT, если INT уже слишком велико.

...