将带符号的长整数(32位)存储为4个八位字节?

时间:2010-04-16 10:27:01

标签: c

我设法通过读取IPv4方法得到无符号长整数字节表示(BE),并设法读取有符号整数如何使用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酒吧

3 个答案:

答案 0 :(得分:2)

没有区别。您总是可以对有符号整数进行序列化/反序列化,就像它们是无符号的一样,不同之处仅在于对位的解释,而不是位本身。

当然,只有当你知道无符号和有符号整数的大小相同时才会这样,所以不会丢失任何位。

此外,您需要小心(因为您)没有中间阶段执行任何未计划的符号扩展等,使用unsigned char个别字节是一个好主意。

答案 1 :(得分:0)

您可能感到困惑的是,通常的做法(并在ix86处理器中应用)使用二进制补码编码对负值进行编码。这意味着4字节-1的十六进制表示法是0xffffffff。使用此编码的原因是,考虑到自动溢出,将2 0x00000002添加到-1将产生正确的结果(0x00000001)。

答案 2 :(得分:0)

你想要这样的东西吗?如果你可以提供你拥有的和你想要的东西,那将是有帮助的(如Vicki所说)。

#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;
}