Примитивные типы ограничивают безопасность

Учитывая, что я являюсь компилятором 32-битного приложения (даже если оно ничего не меняет), этот код безопасен?

cout << (numeric_limits<unsigned int>::max() + 1) << endl;

Он печатает «0», но влияет на немного другой переменной? Допустим, у меня есть байт (char) со следующими битами, а затем я добавляю 1: 1111 1111 (255). Будет ли результат «1 0000 0000» (256), и процессор будет считывать только последние 8 битов в качестве моей переменной или просто сбрасывает последовательность битов?

0

Решение

Проект стандарта C ++, §3.9.1.4 требует, чтобы

Целые числа без знака, объявленные как без знака, должны подчиняться законам арифметики по модулю 2N где n — количество битов в представлении значения этого конкретного размера целого числа.

Таким образом, код в вашем вопросе должен выводить 0, как того требуют законы арифметики по модулю.

Обратите внимание, что указанное выше правило не распространяется на char, поскольку это не объявлено unsigned (вам нужно будет использовать unsigned char вместо).

4

Другие решения

Целочисленные типы без знака подчиняются законам арифметики по модулю 2 ^ N. Результат в этом случае всегда будет 0, и никакая другая память не будет перезаписана.

2

По вопросам рекламы [email protected]