#variables #integer #decimal #long-integer #integer-overflow
Вопрос:
Если переменная, отсчитывающая сотую долю секунды, хранится в 32-разрядном целом числе со знаком, сколько дней, до двух десятичных знаков, потребуется, чтобы это целое число переполнялось?
Комментарии:
1. Меня смущает: » длинное 32-разрядное целое число». В большинстве современных компиляторов
long
обычно используется 64-разрядное целое число.2. Независимо от этого, 32-разрядное целое число со знаком имеет максимальное значение
2147483647
. Нетрудно рассчитать результат ответа на вопрос, зная, что3. @Мартин, пожалуйста, объясните решение.
4. Я действительно не уверен, почему это проблематично, но я ответил ниже, чтобы показать, как это рассчитать
Ответ №1:
Отказавшись от номенклатуры, касающейся «длинного» и «32-разрядного целого числа», предполагая, что вы имеете в виду a signed 32-bit integer
, это просто вычислить следующим образом:
- 32-разрядное целое число со знаком имеет максимальное значение
2,147,483,647
. - При хранении 1/100 секунды это дает максимальное значение
21,474,836.47
в секундах. - В сутках есть
86,400
секунды …60 x 60 x 24 = 86,400
- Следовательно, значение в днях
21,474,836.47 / 86,400 = 248.5513480...
равно . - Это значение для 2dp равно
248.55
.
Снова:
2147483647 ' Signed 32-bit integer max value
/ 100 ' Divide by 100 to get value in seconds
= 21474836.47
/ 86400 ' Divide this by seconds in a day
= 248.55 ' Days (rounded to 2dp)
В качестве альтернативы вы могли бы просто разделить на сотые доли секунды в день ( 8,640,000
), чтобы получить тот же результат:
2147483647 ' Signed 32-bit integer max value
/ 8640000 ' Divide by hundredths of a second in a day
= 248.55 ' Days (rounded to 2dp)
Конечно, если вы на самом деле имели в виду «длинный» (a signed 64-bit integer
), то ответом будут значительно большие 1,067,519,911,673.01
дни (2dp), что эквивалентно почти 3 миллиардам лет!