Обнаружение отрицательных целых чисел с помощью битовых операций

Один из подходов к проверке, является ли данное целое отрицательным или нет, может быть следующим: ( с использованием битовых операций )

int num_bits = sizeof(int) * 8; //assuming 8 bits per byte!
int sign_bit = given_int & (1 << (num_bits-1)); //sign_bit is either 1 or 0
if ( sign_bit )
{
     cout << "given integer is negative"<<endl;
}
else
{
     cout << "given integer is positive"<<endl;
}

Проблема с этим решением заключается в том, что количество битов на байт не может быть 8, оно может быть 9,10, 11, даже 16 или 40 бит на байт. Байт не обязательно означает 8 бит! В любом случае, эту проблему можно легко решить, написав:

//CHAR_BIT is defined in limits.h
int num_bits = sizeof(int) * CHAR_BIT; //no assumption. 

Теперь все в порядке.Но так ли это на самом деле? Соответствует ли этот стандарт? Что, если отрицательное целое число не представлено как дополнение до 2? Что, если это представление в двоичной системе счисления, что не требует, чтобы только отрицательных целых чисел имели 1 в старшем разряде?

Можем ли мы написать такой код, который будет и тем, и другим. переносимый и стандартный?


Связанные темы:
Размер примитивных типов данных
Почему логическое значение имеет размер 1 байт, а не 1 бит?

5
задан Community 23 May 2017 в 12:11
поделиться