Нет, это не так.
Требование представления в виде дополнения 2 для значений в пределах диапазона типа ничего не подразумевает в поведении при переполнении.
Типыв <stdint.h>
- просто typedefs (псевдонимы) для существующих типов.Добавление typedef не меняет поведения типа.
Раздел 6.5, параграф 5 стандарта C (как C99, так и C11) по-прежнему применяется:
Если исключительное условие происходит во время вычисления выражения (то есть, если результат не определен математически или не находится в диапазоне представимых значений для его типа), поведение не определено.
Это нене влияет на неподписанные типы, потому что неподписанные операции не переполняются;они определены так, чтобы получить свернутый результат, уменьшенный по модулю TYPE _MAX + 1. За исключением того, что типы без знака, более узкие, чем int
, повышаются до (подписаны) int
и поэтому могут столкнуться с теми же проблемами,Например, это:
unsigned short x = USHRT_MAX;
unsigned short y = USHRT_MAX;
unsigned short z = x * y;
вызывает неопределенное поведение, если short
уже int
.(Если short
и int
равны 16 и 32 битам соответственно, то 65535 * 65535
дает 4294836225
, что превышает INT_MAX
.)