2015-01-03 3 views
0

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

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

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

+0

Возможный дубликат [Использует неподписанное целочисленное переполнение хорошей практики?] (Http://stackoverflow.com/questions/988588/is-using-unsigned-integer-overflow-good-practice) – Joe

+0

Как на самом деле этот вопрос имеют какое-либо отношение к близкой причине? –

ответ

4

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

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

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

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

+0

Да, я знаю, но это было просто, чтобы прояснить часть бит. Благодаря! :) – Thecheeselover

2

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

Смежные вопросы