Как известно, подписанное целочисленное переполнение - это undefined поведение. Но в документации С++ 11 cstdint
есть что-то интересное:
со знаком целочисленного типа с шириной ровно 8, 16, 32 и 64 бит соответственно без битов заполнения и с использованием 2-х дополнений для отрицательных значений (если только реализация напрямую поддерживает тип)
И вот мой вопрос: поскольку в стандарте явно говорится, что для int8_t
, int16_t
, int32_t
и int64_t
отрицательные числа являются 2 дополнениями, все еще переполняют эти типы a undefined поведение?
Изменить Я проверил стандарты С++ 11 и C11, и вот что я нашел:
С++ 11, §18.4.1:
Заголовок определяет все функции, типы и макросы так же, как 7.20 в стандарте C.
C11, §7.20.1.1:
Имя typedef
intN_t
обозначает целочисленный тип со знаком с шириной N, без битов дополнения и представление двойного дополнения. Таким образом,int8_t
обозначает такой знаковый целочисленный тип с шириной ровно 8 бит.