Значение, содержащееся в 'short int', переполняется, но не в 'auto'? - PullRequest
1 голос
/ 14 июля 2020
#include <iostream>

using namespace std;

int main()
{
    unsigned long maximum = 0;
    unsigned long values[] = {60000, 50, 20, 40, 0};
    
    for(short value : values){
        cout << "Current value:" << value << "\n";

        if(value > maximum)
            maximum = value;
    }
    cout << "Maximum value is: " << maximum;
    
    cout << '\n';
    return 0;
}

Выходы:

Current value:-5536
Current value:50
Current value:20
Current value:40
Current value:0
Maximum value is: 18446744073709546080

Я знаю, что не должен использовать short внутри for l oop, лучше использовать auto, но мне просто интересно, что это что здесь происходит?

Я использую Ubuntu с g++ 9.3.0 Я полагаю.

Ответы [ 2 ]

6 голосов
/ 14 июля 2020

Проблема связана с short value при достижении элемента 60000.

Это слишком велико, чтобы поместиться в short на вашей платформе, поэтому ваш short переполняется, с определением реализации результаты.

Кажется, что в вашем случае происходит то, что 60000 оборачивается к отрицательному -5536, а затем преобразуется (четко определенным) в unsigned long, что в вашем случае равно 2 64 - 5536: это равно максимуму, отображаемому вашей программой.

Одно исправление - использовать идиоматию c

for(auto&& value: values){
0 голосов
/ 14 июля 2020

Проблема довольно проста: 2-байтовое целое число типа short может содержать только значения от -32 768 до 32 767. После этого он переполняется. Вы указали 60000, что, очевидно, является переполнением для short int.

Когда вы используете здесь auto, value преобразуется в соответствующий тип, который может содержать такое большое число (примечание что это зависит от платформы, на которой вы запускаете программу.)

В моем случае value преобразуется в unsigned long, который находится в диапазоне от 0 до 4294967295.

...