int32_t
не гарантированно существует на данной платформе.Предположительно, если бы у вас была архитектура без дополнения двойки, int32_t
не был бы определен.
Начиная с 7.20.1.1 стандарта, описывающего целые числа точной ширины:
typedefname intN_t обозначает целочисленный тип со знаком шириной N, без битов заполнения и дополнения до двух.Таким образом, int8_t обозначает такой целочисленный тип со знаком с шириной ровно 8 бит.
Имя определения типа uintN_t обозначает целочисленный тип без знака с шириной N и без битов заполнения.Таким образом, uint24_t обозначает такой целочисленный тип без знака с шириной ровно 24 бита.
Эти типы являются необязательными. Однако, если реализация предоставляет целочисленные типы с шириной 8, 16, 32или 64 бита, без дополнительных битов и (для подписанных типов), имеющих представление дополнения до двух, он должен определять соответствующие имена typedef.
Если по какой-либо причине машина со знакомдолжна была быть создана архитектура -and-magnitude или one -plement и адаптирован для нее компилятор, и этот компилятор решил, что он выберет создание опций с типом точной ширины, при этом автору компилятора придется преобразовать целые числа с точной ширинойк родным целочисленным типам всякий раз, когда они хотят выполнить арифметику над ними, а затем преобразовать обратно для сохранения в переменной.Это может быть особенно проблематично, поскольку дополнение к двум может представлять более широкий диапазон значений, чем знак и величина и дополнение к нему.
tl; dr: компилятор может возможно сделать точную реализациюцелочисленной ширины на платформе, которая не является дополнением к двум, но на самом деле никто не потрудится сделать это, потому что они являются необязательными, а реализация будет довольно неэффективной.