3字节有符号值到4byte有符号值

时间:2014-10-01 09:38:23

标签: c int signed

我有一个3字节的有符号值:

0xffe8a4

我需要存储在一个4字节有符号(32位)的INT中,因为符号位位于第24位,直接转换为32位INT不会保留值的负元素,因此将其更改为a正数。

如何转换为32位数字并保留原始预期值?

提前致谢!

4 个答案:

答案 0 :(得分:2)

如果数字为正数:

0xffe8a4 - > 0x00ffe8a4

如果数字为负数:

0xffe8a4 - > 0xffffe8a4

使用 | >> << 运营商

答案 1 :(得分:2)

在这里,您需要获取数字的绝对值,以便将其存储在常规int中。

int val = 0xffe8a4 ;
val = -(((~val)&0xffffff) + 1); // val is now the negative number stored as a 4 byte int
// val = ~((~val)&0xffffff); also works ;)

您也可以这样继续:

int val = 0xffe8a4;
val = val|((val&0x80000)*0xff000000);

答案 2 :(得分:1)

您可以测试符号位,如果是0,请在0x00前加上编号,否则在0xff前加上。 像这样(警告:没有测试):

int yourCustomNumberIsStoredHere = 0xffe8a4; //I know it won't actually be your number, because int is 4 byte, but I don't know how your store it in your program.
int result = yourCustomNumberIsStoredHere;
if (yourCustomNumberIsStoredHere & (0x80 << 16))
    result |= 0xff << (24);

有关该主题的参考:Wikipedia: Two's complement (how negative numbers are stored in memory)

答案 3 :(得分:1)

如果您的数据是内存中三个单独寻址的字节,那么

int32 result = ((int)(signed char) HiByte << 16)
             + ((unsigned char)MidByte << 8) + (unsigned char) LoByte;

第一项强制符号位扩展(通过将signed-byte转换为int),stillig部分只是在结果值中定位八位字节。输入字节的单独寻址可确保结果在big-endian和low-endian系统中都是正确的。