Хранить подписанный длинный int (32 бита) как 4 октета? - PullRequest
0 голосов
/ 16 апреля 2010

Мне удалось получить представление беззнаковых длинных int-октетов (BE), читая методы IPv4, и мне удалось прочитать о том, как целые числа со знаком используют MSB в качестве индикатора знака, что делает 00 00 00 00 равным 0 в то время как 7F FF FF FF - 2147483647.

Но я не могу сделать то же самое для длинных целых чисел со знаком?

#include <stdio.h>
#include <string.h>

int main (void)
{
    unsigned long int intu32;
    unsigned char octets[4];

    intu32 = 255;

    octets[3] = (intu32) & 255;
    octets[2] = (intu32 >> 8) & 255;
    octets[1] = (intu32 >> 16) & 255;
    octets[0] = (intu32 >> 24) & 255;
    printf("(%d)(%d)(%d)(%d)\n", octets[0], octets[1], octets[2], octets[3]);

    intu32 = (octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3];
    printf("intu32:%lu\n", intu32);

    return 0;
}

Спасибо заранее, Doori bar

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Разницы нет.Вы всегда можете сериализовать / десериализовать целые числа со знаком, как если бы они были беззнаковыми. Разница заключается только в интерпретации битов, а не в самих битах.и целые числа со знаком имеют одинаковый размер, поэтому биты не теряются.

Кроме того, вы должны быть осторожны (как и вы), чтобы никакая промежуточная стадия не использовала незапланированное расширение знака и т.п.unsigned char для отдельных байтов - хорошая идея.

0 голосов
/ 16 апреля 2010

Хочешь что-нибудь подобное? Было бы полезно (как спросила Вики), если бы вы могли предоставить то, что у вас есть и что вы хотите получить.

#include <stdio.h>
#include <string.h>

int main (void)
{
    union{
        long int intu32;
        char octets[4];
    } u;
    u.intu32 = 255;

    printf("(%d)(%d)(%d)(%d)\n", (int) u.octets[3], (int) u.octets[2], (int) u.octets[1], (int) u.octets[0]);

    printf("intu32:%lu\n", u.intu32);

    return 0;
}
0 голосов
/ 16 апреля 2010

Вы, вероятно, смущены тем, что это обычная практика (и применяется в процессорах ix86) для кодирования отрицательных значений с использованием кодирования с дополнением до двух. Это означает, что шестнадцатеричное обозначение 4 байта -1 равно 0xffffffff. Причина использования этой кодировки заключается в том, что с учетом автоматического переполнения добавление 2 0x00000002 к -1 даст правильный результат (0x00000001).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...