C语言int32_t与int32_T,iOS与c++混编中,关于int32_t,int64_t的兼容

在iOS开发中,处理整数变量时需注意NSInteger、CGFloat、int、long等类型在32位和64位系统中的差异。int32_t和int64_t是固定大小的整数类型,避免数据溢出问题。在64位系统中,NSInteger是long的别名,占8个字节,而在32位系统中则为4个字节。因此,使用int64_t确保在不同系统下存储大整数的安全性。类型转换时也需谨慎,如int64_t到NSInteger的转换可能在32位系统中导致溢出。为了跨平台兼容性,推荐使用int32_t和int64_t等固定宽度类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在iOS中,我们经常使用 NSInteger CGFloat NSTimeInternal int long long long等来处理基本变量,而在与C++混编时,经常会遇到int32_t int64_t类型,这时如果使用类型不当,可能会导致数据溢出的问题,👇看

int32_t 是int的别名, 占4个字节

int64_t 是long long的别名, 占8个字节

由此可看出我们可使用 int long long来处理这两种类型

附:NSInteger 在32位与64位系统的区别

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

typedef long NSInteger;

typedef unsigned long NSUInteger;

#else

typedef int NSInteger;

typedef unsigned int NSUInteger;

#endif

在32位系统中

int 占4个字节

long 占4个字节

long long 占8个字节

NSInteger 是int的别名, 占4个字节

int32_t 是int的别名, 占4个字节

int64_t 是long long的别名, 占8个字节

在64位系统中

int 占4个字节

long 占8个字节

long long 占8个字节

NSInteger 是long的别名, 占8个字节

int32_t 是int的别名, 占4个字节

int64_t 是long long的别名, 占8个字节

4字节的整数变量, 它的范围是 -2147483648 ~ 2147483647

如果不带符号, 它的范围是 0 ~ 4294967295

8字节的整数变量, 它的范围是 -9223372036854775808 ~ 9223372036854775807

如果不带符号, 它的范围是 0 ~ 18446744073709551615

由于long和NSInteger的字节数变了, 所以在兼容的时候可能会导致溢出.

案例一: 对于一个11位的整数

在64位系统中使用NSInteger或者long类型, 是可以正常存储的.

在32位系统中使用NSInteger或者long类型它就溢出了.

所以要保证某些较大的整数可以正常使用,那么就需要使用long long或者int64_t这样的类型.

案例二: 在类型转换的时候,

例如int64_t转换成NSInteger, 在64位系统中是正常的, 但在32位系统中就可能会导致溢出.

总结:

在兼容32位和64位系统,使用int, long long(或者int32_t,int64_t)这样的数据类型比使用NSInteger可靠得多.

处理数据问题一定要谨慎,这种类型的bug一般很不好查,只能靠平常写的时候多注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值