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