我通过UDP接收大端数据并将其转换为小端.消息来源说整数是有符号的,但是当我交换有符号整数的字节(特别是16位)时,我会得到不切实际的值.当我把它们换成无符号的整数时,我得到了我的期望.我想源文档可能不正确,实际上是发送无符号的16位整数.但为什么会这么重要?这些值都应该是正数,并且在16位INT_MAX下,因此溢出不应该是一个问题.我唯一能想到的是(1)文档错误和(2)当我执行有符号的字节序交换时,我没有正确处理符号位.
我真的有两个问题:
1)当溢出不成问题时,我是否读入有符号或无符号的整数是否重要.
2)有符号值和无符号值之间的字节序交换是否不同(即符号位是否需要以不同方式处理)?
我认为对于有符号和无符号值,endian转换看起来都是相同的,例如对于16位value = value&0xff00 >> 8 | value&0x00ff << 8
.
谢谢
您在交换功能中遇到了符号扩展问题.而不是这样做:
value & 0xff00 >> 8 | value & 0x00ff << 8
做这个:
((value >> 8) & 0x00ff) | ((value & 0x00ff) << 8)
问题是如果value
是16位有符号值,0xabcd >> 8
则为0xffab
.如果在有符号的右移中开始为1,则最高有效位保持为1.
最后,你应该使用自己而不是自己编写这个函数ntohs()
.