gpt4 book ai didi

endianness - 有符号整数的字节序转换

转载 作者:行者123 更新时间:2023-12-05 01:38:14 25 4
gpt4 key购买 nike

我正在通过 UDP 接收大端数据并将其转换为小端。消息来源说整数是有符号的,但是当我交换有符号整数(特别是 16 位)的字节时,我得到了不切实际的值。当我将它们交换为无符号整数时,我得到了我所期望的。我想源文档可能不正确,实际上是在发送无符号的 16 位整数。但这有什么关系呢?这些值都应该是正数并且远低于 16 位 INT_MAX,因此溢出应该不是问题。我唯一能想到的是(1)文档是错误的并且(2)当我执行有符号字节序交换时,我没有正确处理符号位。

我真的有两个问题:

1) 当溢出不是问题时,我读入有符号整数还是无符号整数有关系吗?

2) 有符号值和无符号值之间的字节序交换是否不同(即符号位是否需要以不同方式处理)?

我认为有符号和无符号值的字节序转换看起来相同,例如对于 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() ,而不是自己编写这个函数。

关于endianness - 有符号整数的字节序转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com