Стандарт C на отрицательном нуле ( 1 дополнение и величина со знаком)

Все эти функции дают ожидаемый результат на моей машине. Все ли они работают на других платформах?

Более конкретно, если x имеет битовое представление 0xffffffff на машинах с дополнением до 1 или 0x80000000 на машинах со знаковой величиной, что стандарт говорит о представлении (беззнакового) x?

Кроме того, Я думаю, что приведение (без знака) в v2, v2a, v3, v4 является избыточным. Это правильно?

Предположим, что sizeof (int) = 4 и CHAR_BIT = 8

int logicalrightshift_v1 (int x, int n) {

    return (unsigned)x >> n;
}

int logicalrightshift_v2 (int x, int n) {

    int msb = 0x4000000 << 1;
    return ((x & 0x7fffffff) >> n) | (x & msb ? (unsigned)0x80000000 >> n : 0);
}

int logicalrightshift_v2a (int x, int n) {

    return ((x & 0x7fffffff) >> n) | (x & (unsigned)0x80000000 ? (unsigned)0x80000000 >> n : 0);
}

int logicalrightshift_v3 (int x, int n) {

    return ((x & 0x7fffffff) >> n) | (x < 0 ? (unsigned)0x80000000 >> n : 0);
}

int logicalrightshift_v4 (int x, int n) {

    return ((x & 0x7fffffff) >> n) | (((unsigned)x & 0x80000000) >> n);
}

int logicalrightshift_v5 (int x, int n) {

    unsigned y;
    *(int *)&y = x;
    y >>= n;
    *(unsigned *)&x = y;
    return x;
}

int logicalrightshift_v6 (int x, int n) {

    unsigned y;
    memcpy (&y, &x, sizeof (x));
    y >>= n;
    memcpy (&x, &y, sizeof (x));
    return x;
}
7
задан CharlesB 4 May 2012 в 23:21
поделиться