int字节问题说明

今天发现NEON技术中 int类型的字节数是2,感觉很奇怪,最早写51单片机时也是2,后来到了观念转变成了4,现在有遇到了2 

一、转自 http://www.tuicool.com/articles/6j2uqi2

最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。下面列举在GCC编译器下32位机器和64位机器各个类型变量所占字节数:

  C类型               32                  64
  char                1                   1
  short int           2                   2
  int                 4                   4
  long int            4                   8
  long long int       8                   8
  char*               4                   8
  float               4                   4
  double              8                   8


        需要说明一下的是指针类型存储的是所指向变量的地址,所以32位机器只需要32bit,而64位机器需要 64bit 。以上文章来自: http://charlesxie.blog.51cto.com/2236179/939680 由于写的太好了,所就直接摘了下来!

补充总结

经过询问,网上查找以及测试,发现数据类型占内存的位数实际上与操作系统的位数和编译器(不同编译器支持的位数可能有所不同)都有关 ,具体某种数据类型占字节数得编译器根据操作系统位数两者之间进行协调好后分配内存大小。具体在使用的时候如想知道具体占内存的位数通过sizeof(int)可以得到准确的答案。 

二、转载自: https://zhidao.baidu.com/question/128406170.html

Int16的最大值最小值范围?Int16在 -32768+32767 之间。   

在C语系编程语言(C、C++、C#、Java等)中,是一种整数数据类型定义的标示符。例如:int i;。   

常用的单片机编译器,如KEIL下,51类单片机的C语言中,int代表2个字节(16位);如果是32位RAM处理器的C语言中,则int代表4个字节(32位),PIC单片机的PICC中8位系列单片机的C语言里int表示16位。   

而不少PC端软件的编译器则会根据操作系统或处理器(如64位XP)把int定义为8字节(64位);

所以在多平台上编程的人员需要在使用时注意,如需定义16位数,可使用short(短、短整数类型)定义。Int同样可以用于常量(let)。 

三、PHP在不同平台上占字节数与最大值

  在32位平台上int占4个字节,在64位平台上int占8个字节,PHP_INT_SIZE;

  在32位平台上int的最大值2^31 - 1,在64位平台上int最大值2^63 - 1,PHP_INT_MAX。php中int不支持无符号;

四、为什么在不同的平台上int类型所占字节数有差异呢?

不管什么类型,编译型语言都会把源码编译成机器码,由于不同平台寄存器位宽不一样, 所以有了自己对int的规定, 导致int 这个数据类型比较特殊,具体分配的字节数与机器字长和编译器有关。但一般等于机器寄存器位宽(64位平台除外,默认为4字节),如在32位平台上(所谓32位平台是指通用寄存器的数据宽度是32)编写代码,int 类型分配4个字节,而在16位平台是则分配2个字节。编译器是把代码转换为机器码的软件,如果他愿意,可以把int转换为256位的,只不过会增加机器的复杂度,降低可移植性。

五、平台

个人把这三者合起来考虑(CPU+OS+Compiler)是因为:

1、64位机器也可以装32位系统(x64装XP);

2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的);

3、即使是32位的编译器也可以弄出64位的integer来(int64)。

以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。另外一个话题,如果只是从抽象的层面来看,每个程序有的只是虚拟的计算环境,可以不必考虑实际的环境,只需要了解虚拟环境的情况就可以了,这在不考虑移植性或者非底层编程的时候是很有帮助的,这样可以使你关注你的逻辑而不是实现。

六、扩展

一般情况下:

32位编译器

char      short      int      long      float      double      指针

   1            2           4         4            4              8            4

64位编译器

char      short      int      long      float      double      指针

   1            2           4         8            4              8            8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值