Учитывая, что я являюсь компилятором 32-битного приложения (даже если оно ничего не меняет), этот код безопасен?
cout << (numeric_limits<unsigned int>::max() + 1) << endl;
Он печатает «0», но влияет на немного другой переменной? Допустим, у меня есть байт (char) со следующими битами, а затем я добавляю 1: 1111 1111 (255). Будет ли результат «1 0000 0000» (256), и процессор будет считывать только последние 8 битов в качестве моей переменной или просто сбрасывает последовательность битов?
Проект стандарта C ++, §3.9.1.4 требует, чтобы
Целые числа без знака, объявленные как без знака, должны подчиняться законам арифметики по модулю 2N где n — количество битов в представлении значения этого конкретного размера целого числа.
Таким образом, код в вашем вопросе должен выводить 0, как того требуют законы арифметики по модулю.
Обратите внимание, что указанное выше правило не распространяется на char
, поскольку это не объявлено unsigned
(вам нужно будет использовать unsigned char
вместо).
Целочисленные типы без знака подчиняются законам арифметики по модулю 2 ^ N. Результат в этом случае всегда будет 0, и никакая другая память не будет перезаписана.