Есть одна идиома кода, которая сломалась бы, если бы целые числа были 64-битными, и я вижу это достаточно часто, так что я думаю, что это можно назвать разумным:
- проверка, является ли значение отрицательным, проверяя, если
((val & 0x80000000) != 0)
Обычно это встречается при проверке кодов ошибок.Многие стандарты кодов ошибок (например, HRESULT
в Windows) используют бит 31 для представления ошибки.И код иногда проверяет эту ошибку, проверяя бит 31 или иногда проверяя, является ли ошибка отрицательным числом.
Макросы Microsoft для тестирования HRESULT используют оба метода - и я уверен, что есть тонна кодатам, что делает подобное без использования макросов SDK.Если бы MS перешла на ILP64, это было бы одной из областей, которая вызывала головные боли при портировании, которые полностью избегались при использовании модели LLP64 (или модели LP64).
Примечание: если вы не знакомы с терминамикак "ILP64", пожалуйста, посмотрите мини-глоссарий в конце ответа.
Я почти уверен, что есть много кода (не обязательно ориентированного на Windows), который использует простойold-int для хранения кодов ошибок, при условии, что эти целые имеют размер 32 бита.Держу пари, что с этой схемой состояния ошибок есть много кода, который также использует оба вида проверок (устанавливается < 0
и бит 31) и который сломался бы при переходе на платформу ILP64.Эти проверки можно было бы выполнить для продолжения корректной работы в любом случае, если бы коды ошибок были тщательно сконструированы таким образом, чтобы происходило расширение знака, но, опять же, многие такие системы, которые я видел, создают значения ошибок, объединяя кучу битовых полей..
В любом случае, я не думаю, что это неразрешимая проблема каким-либо образом, но я думаю, что это довольно распространенная практика кодирования, которая может привести к исправлению большого количества кода в случае его перемещения на платформу ILP64..
Обратите внимание, что я также не думаю, что это была одна из главных причин, по которой Microsoft выбрала модель LLP64 (я думаю, что это решение во многом было обусловлено совместимостью двоичных данных между 32-разрядными и 64-разрядными процессами., как упоминается в MSDN и в блоге Рэймонда Чена ).
Мини-глоссарий для модели программирования 64-битной платформытерминология:
- ILP64:
int
, long
, указатели 64-битные - LP64:
long
и указатели 64-битные, int
это 32-биты(используется многими (большинством?) платформами Unix) - LLP64:
long long
и указатели 64-битные, int
и long
остаются 32-битными (используется в Win64)
Подробнее о 64-битных моделях программирования см. «64-битные модели программирования: почему LP64?»