Когда использовать неподписанные значения по со знаком?

В вашем случае вы можете сделать что-то вроде этого:

ifstream file { "file.txt" };
if (!file.is_open()) return -1;

int my_array [3][5]{};
for (int i{}; i != 3; ++i) {
    for (int j{}; j != 5; ++j) {
        file >> my_array[i][j];
    }
}

Лучше всего использовать std::vector :

vector my_array;
int num { 0 };
while (file >> num)
    my_array.emplace_back(num);

78
задан Peter Mortensen 7 July 2013 в 15:23
поделиться

5 ответов

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

, Таким образом, подписанный хороший общий выбор - даже когда Вы абсолютно уверенны, все числа положительны - если Вы собираетесь сделать арифметику на переменной (как в типичном для случая цикла).

, Если Вы собираетесь сделать поразрядные вещи как маски, неподписанные запуски, чтобы иметь больше смысла. Или, если Вы отчаянно пытаетесь получать тот дополнительный положительный диапазон путем использования в своих интересах знакового бита.

Лично, мне нравится подписанный, потому что я не доверяю мне, чтобы остаться последовательным и постараться не смешиваться, два типа (как статья предостерегает от).

66
ответ дан saint_groceon 24 November 2019 в 10:39
поделиться

В Вашем примере выше, когда 'я' всегда буду положителен и более высокий диапазон был бы выгоден, неподписанный будет полезно. Как то, если Вы используете, 'объявляют' операторы, такие как:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Особенно, когда эти значения никогда не будут изменяться.

Однако при выполнении бухгалтерской программы, где люди являются безответственными со своими деньгами и постоянно в долгах, Вы совершенно определенно захотите использовать 'подписанный'.

я действительно соглашаюсь со святым, хотя это, которое хорошее эмпирическое правило должно использовать подписанный, какой C на самом деле значения по умолчанию к, таким образом, Вы застрахованы.

9
ответ дан helloandre 24 November 2019 в 10:39
поделиться

C и компиляторы C++ генерирует предупреждение при сравнении подписанных и неподписанных типов; в Вашем примере кода Вы не могли сделать свою переменную цикла неподписанной и иметь компилятор, генерируют код без предупреждений (принимающий, сказал, что предупреждения были включены).

Естественно, Вы компилируете с предупреждениями, превращенными полностью, правильно?

И, Вы полагали, что компиляция с "предупреждениями обработки как ошибки" берет его что один шаг вперед?

оборотная сторона с использованием чисел со знаком - то, что существует искушение перегрузить их так, чтобы, например, значения 0-> n были выбором пункта меню и-1 средством, которые ничто не выбрало - вместо того, чтобы создать класс, который имеет две переменные, один, чтобы указать, выбрано ли что-то и другой для хранения, каков тот выбор. Перед знанием этого Вы тестируете на отрицательный повсеместно, и компилятор жалуется на то, как Вы желаете сравнить выбор пункта меню с количеством выборов пункта меню, которые Вы имеете - но это опасно, потому что они - различные типы. Не делайте этого.

8
ответ дан Josh 24 November 2019 в 10:39
поделиться

Я думал бы, что, если Ваша экономическая модель диктует, что отрицательное число недопустимо, Вы были бы хотеть показать ошибку или брошенный.

, Имея это в виду, я только что недавно узнал о целых числах без знака при работе над проектом, обрабатывающим данные в двоичном файле и хранящим данные в базу данных. Я намеренно "повреждал" двоичные данные и закончил тем, что получил отрицательные величины вместо ожидаемой погрешности. Я нашел это даже при том, что преобразованное значение, значение не было допустимо для моей экономической модели.
Моя программа не сделала ошибки, и я закончил тем, что получил неправильные данные в базу данных. Было бы лучше, если бы я использовал uint и имел сбой программы.

8
ответ дан Peter Mortensen 24 November 2019 в 10:39
поделиться

size_t часто хороший выбор для этого, или size_type, если Вы используете класс STL.

6
ответ дан mk12 24 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: