如何测试有符号或无符号整数的最高有效位?

给出一个保证为某种整数的#pragma数据类型,如何使用可移植的C代码测试最高有效位的值?换句话说,我需要此函数的定义:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
if (value < 0 || value >= 9) {
    throw std::invalid_argument("some error message");
}
#pragma GCC diagnostic pop

但是这里有一个转折点:您不知道clock_t的大小,也不知道它是带符号的还是无符号的(但假定“带符号”是二进制补码)。

我的第一个想法就是这样做:

bool is_msb_set(clock_t clock);

但是,如果clock_t是一个带符号的值,则MSB的定义会溢出。也许我想得太多,但我很沮丧。

yanghao19840201 回答:如何测试有符号或无符号整数的最高有效位?

只需不带掩码即可直接测试该值:

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,所以最高有效位将始终设置为1。如果不是负数,则为正数,并且clock_t被签名,则>>被正确定义。

如果clock_t是无符号的,则value < 0将始终返回0,并且很可能应该由编译器进行优化。

如果clock_t不是整数类型(例如,它是floatdouble),则不应编译代码,因为>>的操作数需要具有整数类型。因此,它仅适用于整数类型。

,

我认为我们可以先检查clock_t是否已签名,然后进行相应操作。

bool is_msb_set(clock_t value) {
    if ((clock_t)-1 < 0) {
        /* clock_t is signed */
        return value < 0;
    } else {
        /* clock_t is unsigned */
        return ((value << 1) >> 1) ^ value;
    }
}
,

您可以做的是将其强制转换为一个整数,该整数必须足够大(所以很长?),然后然后1 << ((sizeof(clock_t) * 8) - 1);进行测试。

我也将从断言sizeof(clock_t) <= sizeof(long)开始。

本文链接:https://www.f2er.com/3169813.html

大家都在问