Iphone 什么时候在Objective-C中sizeof(int)不是4字节?

Iphone 什么时候在Objective-C中sizeof(int)不是4字节?,iphone,objective-c,cocoa,macos,networking,Iphone,Objective C,Cocoa,Macos,Networking,我使用的是一个开源的网络框架,它使开发人员可以通过Objective-C中使用Bonjour的服务轻松地进行通信 有几行代码让我焦躁不安了一段时间,尽管它们似乎从未在我测试过的任何机器上造成任何问题,无论我是否运行32位或64位版本的应用程序: int packetLength = [rawPacketData length]; [outgoingBuffer appendBytes:&packetLength length:sizeof(int)]; [outgoingBuffer a

我使用的是一个开源的网络框架,它使开发人员可以通过Objective-C中使用Bonjour的服务轻松地进行通信

有几行代码让我焦躁不安了一段时间,尽管它们似乎从未在我测试过的任何机器上造成任何问题,无论我是否运行32位或64位版本的应用程序:

int packetLength = [rawPacketData length];
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingBuffer appendData:rawPacketData];
[self writeToStream];
请注意,发送的第一条信息是数据包的长度,这是相当标准的,然后发送数据本身。让我害怕的是长度的长度。一台机器会假定int为4字节,而另一台机器则认为int为8字节吗


如果这两种尺寸在不同的机器上可能不同,是什么原因造成的?它是依赖于我的编译器,还是最终用户的机器架构?最后,如果这是一个问题,我怎样才能获得一个8字节的int并将其压缩到4字节以确保向后兼容性?(因为我永远不需要超过4个字节来表示数据包的大小。)

您不能假设
sizeof(int)
总是4个字节。如果大小很重要,您应该硬编码大小为4(并编写代码以将值序列化为具有适当尾数的四字节数组),或者使用
中定义的
int32\t
类型


(然而,实际上,大多数编译器供应商已经决定
int
应该保留四个字节,因此您可能不必担心明天会出现任何问题。不久前,许多编译器供应商将
int
设为两个字节,当
int
变为四个字节时,会导致许多问题s、 所以你真的应该以正确的方式做事,以防将来发生变化。)

可能会有所不同,但这更多地取决于编译器而不是机器。不同的编译器可能会将int重新声明为8字节。

我认为只有
long
在32位或64位系统上大小不同?

int的大小取决于机器架构;int的大小几乎总是数据总线的大小,除非您的C编译器执行一些特殊的操作并对其进行更改

这意味着在8位、16位或64位机器/体系结构中编译程序时,int的大小不是4字节

我将为缓冲区大小定义一个常量,而不是使用int大小


希望这能回答您的问题。

我对此不确定。当我以32位或64位编译/运行我的应用程序时,两种情况下的sizeof(int)都是4。C标准只规定sizeof(int)至少为2。这应该是最“自然”的计算机体系结构上的整数大小,但编译器实现者可以选择他们想要的大小。@craig因为您当前的计算机是32位计算机,是Apple A4处理器,对吗?@craig如果在64位计算机上执行相同的编译程序,最好知道会得到什么。@Julio:x86_64的默认值,使用Apple的developer工具将有32位整数、64位长整数和64位指针。这是一种被称为LP64的约定。克里斯托弗,简单地强制转换任何更大的类型(或者,仅仅是整数)会有惩罚吗对于int32_t?假设高阶位被截断是否安全?我从不期望任何数据包大小大于int32_t的最大大小,因此,如果该数字实际上大于int32_t,则在其他地方都是错误的。明智/安全的做法是在将其转换为较小的类型之前测试该数字。您可能不会期望值to永远不要太大,但如果黑客可以利用这个漏洞(通过发送太大的数据包或发送格式错误的数据包),那么您需要检查。