Posix обычно сдвинут со стандартом ISO C, но есть целый ряд мест, где Posix добавляет дополнительное ограничение, некоторые из которых помечен как расширения (CX):
POSIX.1-2008 действует частично как профиль стандарта ISO C, и он может выбрать для дальнейшего конструк ain поведения допускается варьироваться в соответствии со стандартом ISO C. Такие ограничения и другие совместимые различия не считаются конфликтами, даже если отсутствует метка CX. Маркировка предназначена только для информации.
Одним из таких дополнительных ограничений является существование целых чисел точной ширины. Стандарт C требует типов int_{least,fast}{8,16,32,64}_t
и их неподписанных аналогов. Он не требует типов точной ширины, таких как int32_t
, если не используется какой-либо целочисленный тип. Тип точной ширины должен иметь точно количество битов, указанных в его имени (т. Е. Никаких битов заполнения) и должно иметь представление 2's-комплемента. Таким образом, INT32_MIN
, если он определен, должен быть точно -2 (§ 7.20.2.1).
Однако Posix делает требует точных ширины типов int{8,16,32}_t
(а также без знака аналогов), а также int64_t
, если такой тип обеспечивается реализацией. В частности, требуется int64_t
, если «реализация поддерживает среду программирования _POSIX_V7_LP64_OFF64
, и приложение строится в среде программирования _POSIX_V7_LP64_OFF64
». (XBD, § 13, stdint.h
) (Эти требования помечены как CX.)
Несмотря на то, что int32_t
должен существовать, и, следовательно, должен быть около 2 Типа дополнения доступны, до сих пор нет гарантии, что signed long
является 2'-дополнение, и даже если это так, нет гарантии, что целочисленное переполнение обернется вокруг, а не, например, захват.
самое непосредственное отношение к первоначальному вопросу, однако, является тот факт, что даже если signed long
того же типа, как int64_t
и даже если знаковое целое переполнение обтекает, оболочка не несет никаких обязательств на самом деле использовать signed long
для расширения арифметической. Он может использовать любой тип данных «пока он не влияет на результаты в случаях, когда нет переполнения». (XSH, § 2.6.4)
Я не думаю, вычитанием 1 после того, как она переполнена поможет :-) Попробуйте эхо $ (((1 << 63) - 1)) (!) .. 9223372036854775807 –
@MarkSetchell: точка в том, что '1 << 64' переполняется на моей машине. В этом случае результат не имеет значения. – jfs
У меня были видения о том, что вы делаете бинарный поиск, чтобы найти сдвиг, который не переполнялся ... << 48, << 56, << 60, –