Просто протестируйте значение напрямую без маски:
bool is_msb_set(clock_t value) {
if (value < 0) return 1;
return value >> (sizeof(clock_t) * CHAR_BIT - 1);
}
Если левая сторона оператора >>
имеет «тип со знаком и отрицательное значение, результирующее значение определяется реализацией», см. C11 6.5.7p5 .
Поскольку мы assumed "signed" is twos-compliment
, я могу просто проверить, если value
меньше 0, старший бит всегда будет установлен в единицу. Если оно не отрицательное, оно положительное, и clock_t
подписано, то >>
правильно определено.
Если clock_t
не подписано, то value < 0
всегда вернет 0
и, скорее всего, должнобыть оптимизирован компилятором.
Код не должен компилироваться, если clock_t
не является целочисленным типом (например, если это float
или double
), потому что операнды >>
нужно иметь целочисленный тип. Так что это будет работать только для целочисленных типов.