Hi,
在Android上有些运算有问题(C代码)
4字节x2组成8字节 这里有两种做法:
1. 将8字节变量当做一个int[2]然后各自赋值
2. 将高4字节<<32 然后再 | 低4字节
这里,方法2没有问题。而方法一结果有误
请问可否有什么方法解决这个问题?
Thanks
- C/C++ code
//方法1 unsigned int HIGH_INT(unsigned long long d){ unsigned long long dcopy = d; return ((unsigned int*)&dcopy)[1];} unsigned long long MAKE_DBLINT(unsigned int high, unsigned int low){ unsigned long long build = low; ((unsigned int*)&build)[1] = high; return build;} void printInt(unsigned long long l) { unsigned int high = HIGH_INT(l),low = (unsigned int)l; LOGV("high=%X low=%X",high,low); }//方法2 unsigned int HIGH_INT2(unsigned long long d) { unsigned long long dcopy = d; return (unsigned int)(dcopy>>32); } unsigned long long MAKE_DBLINT2(unsigned int high, unsigned int low) { unsigned long long build = low; unsigned long long build2 = high; build2 = build2 << 32; build = build | build2; return build; } void printInt2(unsigned long long l) { unsigned int high = HIGH_INT2(l),low = (unsigned int)l; LOGV("high=%X low=%X",high,low); } JNIEXPORT void JNICALL Java_com_arcsoft_drmtest_Native_Test(JNIEnv *, jobject) { unsigned int h = 0x10245670; unsigned int l = 0x89ABCDEF; printInt(MAKE_DBLINT(h,l)); printInt2(MAKE_DBLINT2(h,l));}
------解决方案--------------------
方法1要正确,需要目标平台是little-endian的,int是32位的。这两个条件满足吗?
------解决方案--------------------
在intel的PC上是正确的
但在Android上,ARM?
请考虑大小端问题!
------解决方案--------------------
你要进行位操作 何尝不选择位段了
------解决方案--------------------