我设法通过读取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酒吧
答案 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;
}