关于基本类型的位数(sizeof)

一、 实践 打印iOS基本数据类型长度(ios12.1)

NSLog(@"short:%lu",sizeof(short)); NSLog(@"char:%lu",sizeof(char)); NSLog(@"int:%lu",sizeof(int)); NSLog(@"float:%lu",sizeof(float)); NSLog(@"long:%lu",sizeof(long)); NSLog(@"double:%lu",sizeof(double)); NSLog(@"long long:%lu",sizeof(long long)); NSLog(@"char *:%lu",sizeof(char *));

输出:
short:2 char:1 int:4 float:4 long:8 double:8 long long:8 char *:8

原因:因为操作系统选用的数据模型模型不同,导致int和long的位数有差别;
1. 类Unix平台(iOS、Mac、Linux)用LP64(long和point是64位即8字节)int为32位 ,long为64位;
2. window用LLP64(long long和point是64位)int为32位,long为32位
二、具体参考 https://blog.csdn.net/wzsy/article/details/42170825
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。
TYPE LP32 ILP32 LP64 ILP64 LLP64
CHAR 8 8 8 8 8
SHORT 16 16 16 16 16
INT 16 32 32 64 32
LONG 32 32 64 64 32
LONG LONG 64 64 64 64 64
POINTER 32 32 64 64 64
在这张表中,LP64,ILP64,LLP64是64位平台上的字长模型,ILP32和LP32是32位平台上的字长模型。
LP64意思是long和pointer是64位,
ILP64指int,long,pointer是64位,
LLP指long long和pointer是32-bit的。
ILP32指int,long和pointer是32位的,
LP32指long和pointer是32位的。
【关于基本类型的位数(sizeof)】64位编程模型:为什么要使用LP64:
https://blog.csdn.net/xanadut/article/details/9864891
https://blog.csdn.net/u011348293/article/details/10242089
https://blog.csdn.net/u011348293/article/details/10270689

    推荐阅读