ПРИМЕЧАНИЕ. C и C ++ - это разные языки.Их соответствующие стандарты развивались несколько независимо, и у них есть различные формальные ограничения на числовое представление.
Можем ли мы написать такой код, который будет и переносимым, и совместимым со стандартом?
Предполагая, что вам требуется общий метод идентификации и интерпретации знакового бита, я думаю, что ответ на ваш вопрос - нет.
Относительно C ++: я не думаю, что в стандарте есть явныйТребование о наличии знакового бита.Даже если каждая реализация использует знаковый бит, нет гарантии, что это первый (старший разряд) бит, как предполагает ваш код.Кроме того, бит может иметь противоположную интерпретацию от того, что вы предполагаете (значение «1» для знакового бита может означать, что число положительное).
Относительно C99: язык требует знаковый бит итребует, чтобы знак = 1 обозначал отрицательное число (хотя это может быть «отрицательный ноль»).Однако языковой стандарт не дает общего способа определить, где находится бит знака.
В следующем коде делается попытка создать "sign_mask" в общем виде, но он не гарантирует абсолютной работы вC99 или C ++.Причины сбоя включают в себя те, которые упомянуты выше, но, что наиболее интересно, он может вызывать «представление ловушек» (такое как ошибка бита четности) ...
#ifdef __cplusplus
#define INT_MAX std::numeric_limits<int>::max()
#define UINT_MAX std::numeric_limits<unsigned int>::max()
#endif
// assumes sign bit becomes high-order bit of unsigned
int sign_mask = INT_MAX ^ UINT_MAX;
// fallback in case unsigned type doesn't take advantage of the sign-bit
// This might invoke a "trap representation" on some platforms
if (sign_mask==0) sign_mask = ~INT_MAX;
В этой статье Википедии обсуждаются некоторые различные способы, которыми числа со знакомможет быть представлен в двоичном виде: Представление чисел со знаком
Вот информационный пост о числах со знаком в стандарте C99 .