2014-10-01 97 views
0

我有一个3字节符号值:3字节符号值到4字节符号值

0xffe8a4

,我需要在一个4字节的签名(32位)INT来存储,因为符号位位于位24直接转换为32位INT不保留该值的负值,因此将其更改为正数。

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

在此先感谢!

+0

你在哪里保存了这些3字节的有符号值?什么数据类型? – 2014-10-01 09:42:06

+0

它是由一个无符号字节数组构成的,作为数据包的一部分 – FiniteRed 2014-10-01 09:50:42

+0

在设计任何代码之前,务必要问的第一个问题是:你的3字节整数如何存储? – CiaPan 2014-10-01 09:52:09

回答

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)

2

如果数值为正:

0xffe8a4 - > 0x00ffe8a4

如果数字为负:

0xffe8a4 - > 0xffffe8a4

使用|>>< <运营商

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); 
1

如果您的数据是三个单独解决在内存中的字节,然后

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

第一项强制符号位扩展(通过强制签订字节为int),该remainig部分只是定位八位字节产生的价值。输入字节的单独寻址可确保在大端系统和低端系统中的结果都是正确的。