我有一个3字节的有符号值:
0xffe8a4
我需要存储在一个4字节有符号(32位)的INT中,因为符号位位于第24位,直接转换为32位INT不会保留值的负元素,因此将其更改为a正数。
如何转换为32位数字并保留原始预期值?
提前致谢!
答案 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系统中都是正确的。