C++ int、long、long int、long long、uint64_t字节长度

前言

我们在进行编程时,对于int、long、long long经常使用,但是对于这些类型占用的字节长度可能不会太确定,尤其是在32位平台、64位平台,会有差异,这些知识点为基础知识,容易忽略的基础知识,本文做下分析记录。

不同平台整型字节长度区别

平台/类型charshortintlonglong long
16位12248
32位12448
64位12488

int和short  int


int占用1个机器字长,在32位系统中int占32位,即4个字节,而在16位系统中,int占16位,即2个字节,在c++标准中只限制规定short int不能超过int的长度,具体长度可以由编译器的实现厂商决定,所以目前32位编译器中,
short int占2个字节,int 占4个字节,short int可以简写为short。类似的,c++标准只限制了long int不得小于int的长度,具体长度也没有作出限制。

long 和 long int


我们会看到long 和 long int,其实这两者对于编译器来说时一样的,我们在使用long时,其实已经默认包括了int,同样long long = long long int。
即long是long int的简写,同样的道理 long long是long long int的简写。

int64_t 和 uint64_t

int64_t 和 uint64_t
这两种类型并不是标准的c定义的类型,而是通过typedef重命名的类型,定义在 stdint.h 中:

# if __WORDSIZE == 64
typedef long int		int64_t;
# else
__extension__
typedef long long int		int64_t;
# endif


#if __WORDSIZE == 64
typedef unsigned long int	uint64_t;
#else
__extension__
typedef unsigned long long int	uint64_t;
#endif

从上面的代码也可以看到,如果编译器是64位平台,则uint64_t 其实时unsigned long int,而long int是占用8个字节的。反之,如果编译器是32平台,则uint64_t 是unsigned long long int,也是占用8个字节。

验证

程序如下

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(void)
{
    printf("the os is 64 bit.\n");
    
    printf("__WORDSIZE:%d \n", __WORDSIZE);

    printf("char bytes:%d\n", sizeof(char));

    printf("short bytes:%d\n", sizeof(short));

    printf("int bytes:%d\n", sizeof(int));

    printf("float bytes:%d\n", sizeof(float));

    printf("long bytes:%d\n", sizeof(long));
    
    printf("long int bytes:%d\n", sizeof(long int));

    printf("long long bytes:%d\n", sizeof(long long));

    printf("long long int bytes:%d\n", sizeof(long long int));

    printf("uint64_t bytes:%d\n", sizeof(uint64_t));

    printf("uint32_t bytes:%d\n", sizeof(uint32_t));

    printf("size_t bytes:%d\n", sizeof(size_t));
   
    return 0;
}

执行结果如下:

the os is 64 bit.
__WORDSIZE:64 
char bytes:1
short bytes:2
int bytes:4
float bytes:4
long bytes:8
long int bytes:8
long long bytes:8
long long int bytes:8
uint64_t bytes:8
uint32_t bytes:4
size_t bytes:8

初学时候看的文章都是说根据cpu和编译器位数来区分

 但是经过实际测试发现有点问题,使用intel 64位处理器,64位操作系统,vs2017编译器为64位,对int,long,long long三种类型大小进行测试

#include <iostream>
#include <cstring>
#include<cassert>
#include<climits>
using namespace std;

int main()
{
	int *p;
	cout << "int * = " << sizeof(p) << endl;

	cout << "int: "<<sizeof(int) << endl;
	cout << "long int: " << sizeof(long int) << endl;
	cout << "long long int: " << sizeof(long long int) << endl;

}

输出结果

 

通过指针类型可以看出来编译器确实选择的是64位,但是long和int都是4个字节,与上面的图片不符。

后来看c++相关书籍了解到对于long类型不是单纯通过32位或者64位来决定,而是根据编译平台来决定的,具体是在climits这个头文件里,对应c的话是limits.h中的宏定义来决定所占字节
 

#define INT_MIN     (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX       2147483647    // maximum (signed) int value
#define UINT_MAX      0xffffffff    // maximum unsigned int value
#define LONG_MIN    (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX      2147483647L   // maximum (signed) long value
#define ULONG_MAX     0xffffffffUL  // maximum unsigned long value
#define LLONG_MAX     9223372036854775807i64       // maximum signed long long int value
#define LLONG_MIN   (-9223372036854775807i64 - 1)  // minimum signed long long int value
#define ULLONG_MAX    0xffffffffffffffffui64       // maximum unsigned long long int value

其中MIN和MAX代表取值返回,下划线前面代表类型,U代表无符号,从中可以看到,本平台中int所占为4字节,long也为4个字节,long long为8个字节,不同的编译平台对long的定义可能是不一样的,可以通过这个文件来查看本平台中long定义的大小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值