Если переменная, отсчитывающая сотые доли секунды, хранится в 32-разрядном целочисленном числе со знаком

#variables #integer #decimal #long-integer #integer-overflow

Вопрос:

Если переменная, отсчитывающая сотую долю секунды, хранится в 32-разрядном целом числе со знаком, сколько дней, до двух десятичных знаков, потребуется, чтобы это целое число переполнялось?

Комментарии:

1. Меня смущает: » длинное 32-разрядное целое число». В большинстве современных компиляторов long обычно используется 64-разрядное целое число.

2. Независимо от этого, 32-разрядное целое число со знаком имеет максимальное значение 2147483647 . Нетрудно рассчитать результат ответа на вопрос, зная, что

3. @Мартин, пожалуйста, объясните решение.

4. Я действительно не уверен, почему это проблематично, но я ответил ниже, чтобы показать, как это рассчитать

Ответ №1:

Отказавшись от номенклатуры, касающейся «длинного» и «32-разрядного целого числа», предполагая, что вы имеете в виду a signed 32-bit integer , это просто вычислить следующим образом:

  1. 32-разрядное целое число со знаком имеет максимальное значение 2,147,483,647 .
  2. При хранении 1/100 секунды это дает максимальное значение 21,474,836.47 в секундах.
  3. В сутках есть 86,400 секунды … 60 x 60 x 24 = 86,400
  4. Следовательно, значение в днях 21,474,836.47 / 86,400 = 248.5513480... равно .
  5. Это значение для 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 миллиардам лет!