看看这段代码:
这是带有1byte struct packing(用于套接字网络)的结构定义文件
#pragma pack(1)
typedef struct _TestStruct1 {
double d1;
double d2;
} TestStruct1;
typedef struct _TestStruct2 {
unsigned long v1;
unsigned short v2;
unsigned long v3;
unsigned long value;
TestStruct1 ts1;
} TestStruct2;
#pragma pack()
确定。现在看下面的简单代码:
TestStruct2 wtf;
wtf.v1 = 0;
wtf.v2 = 0;
wtf.v3 = 0;
wtf.value = 4294967295;
wtf.ts1.d1 = 37.785834f;
wtf.ts1.d2 = 37.785834f;
char * cp = (char *)&wtf;
for (int i = 0; i < sizeof(TestStruct2); i++) NSLog(@"[%d] %d", i, (int)cp[i]);
NSLog(@"wtf.value: %lu", wtf.value);
结果在iphone 5.0模拟器XCode 4.2上:
[0] 0
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 0
[9] 0
[10] -1
[11] -1
[12] -1
[13] -1
[14] 0
[15] 0
[16] 0
[17] 64
[18] -106
[19] -28
[20] 66
[21] 64
[22] 0
[23] 0
[24] 0
[25] 64
[26] -106
[27] -28
[28] 66
[29] 64
wtf.value: 4294967295
没有问题。但是当谈到真正的设备(iPhone4)......
[0] 0
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 0
[9] 0
[10] -1
[11] -1
[12] 0
[13] 0
[14] 0
[15] 64
[16] -106
[17] -28
[18] 66
[19] 64
[20] 0
[21] 0
[22] 0
[23] 64
[24] -106
[25] -28
[26] 66
[27] 64
[28] 88
[29] 84
wtf.value: 65535
哦,天哪,会发生什么?我将wtf.value存储为4294967295,但在设备上,它更改为65535。
这个问题只发生在设备上,而不是模拟器上。
在iOS5 XCode4.2之前,这个问题永远不会发生。
我该如何解决?请帮我。
答案 0 :(得分:3)
我有这样的问题,涉及浮点误算,但在UI定位代码中。我通过添加:
来修复它-mno-thumb
到Build Settings下的“Other C Flags”选项,仅适用于 armv6 设备(“添加构建设置”&gt;“添加条件设置”)。
我并不假装准确理解这里发生了什么,但是通过添加此构建设置,您将禁用Thumb指令集,根据某些(http://wanderingcoder.net/2010/07/19/ought-arm/),不建议将其用于armv6构建。 Thumb改变了浮点计算的工作方式。
答案 1 :(得分:0)
根据同一个人(参考Craig的回答),即我,in that very same post,处理ARM上未对齐的数据非常糟糕(模拟器是x86)。我可以理解它对于网络代码中的整数(虽然我宁愿显式序列化),但是没有理由没有错位的浮点数(这里当你存储浮点值时,它似乎是默默地重新排列到一个4字节的边界,它覆盖部分wtf.value)。您没有通过网络传输原始浮点值,对吧?正确?