gpt4 book ai didi

c++ - 将 32 位大端有符号整数转换为有符号小端整数

转载 作者:行者123 更新时间:2023-11-27 22:39:29 24 4
gpt4 key购买 nike

我有一些需要转换的无符号 32 位大端整数,一旦找到正确的 header ,这就非常容易了:

#include <endian.h>
...
be32toh(some_int);

但是,endian.h 指定这些用于无符号整数。对于带符号的整数,我不太确定该怎么做,因为它看起来不像是这类东西的头文件,而且我不太熟悉 C++ 中的位操作。

编辑:由于我的整数格式有些困惑,让我解释一下。我有一个整数形式

abcdefghijklmnopqrstuvwxyz012345

其中每个字符代表一个位。 a 位代表符号。我知道字节总是大端,所以除了将字节移动到不同的顺序之外,比如

yz012345qrstwx...

我还需要一些方法来确保 y 位显示符号,而不仅仅是数字中的某个位。我……不知道该怎么做。

编辑:我的问题是我认为符号位总是排在第一位,但事实并非如此。符号位始终是 MSB,这意味着如果您采用小端格式,则符号位将位于构成整数的字节的中间。

最佳答案

尝试对一个有符号整数进行字节反转听起来不像是一个定义明确的算术运算,因为最高有效位表现为整数符号的指示器,它不会在操作整数变量时将其移动到别处很有意义。

更有可能的是,您可能有 4 个字节的序列,表示一个 32 位有符号整数,但需要进行字节反转以便在不同的 CPU 字节顺序之间进行转换。为此,您只需将数量视为无符号,然后让 be32toh() 为您完成工作:

(int)be32toh((unsigned)some_int);

或者,稍微安全一点:

(int32_t)be32toh((uint32_t)some_int);

这是有效的,因为转换操作应用于相同位深度的整数时,有效地保持内存中的表示不变。在进行字节反转时,这忽略了符号的重要性(以及与带符号整数的二进制补码表示相关的任何细微差别)。我不确定 C 标准是否保证这种行为(也许是语言律师的问题),但这可能是一种非常普遍的行为。 www.cplusplus.com 的描述表示如果您的系统对其有符号整数使用二进制补码表示(这很常见),则 (uint32_t)some_int 中的有符号到无符号转换将做正确的事情。但是,(int32_t)be32toh(...) 中有符号到无符号转换的精确解释严格来说取决于实现。因此,我再次认为,对有符号整数进行字节反转意味着什么的问题在数学上并不明确。

关于c++ - 将 32 位大端有符号整数转换为有符号小端整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50279098/

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