64位系统下的变量长度

摘要

刚学C/C++语言时,电脑主要还都是32位的,不像现在计算机主流平台都已经变成了64位。那个时候,知道int长度是32位,long long是64位,尽量避免使用long。
那么到了64位系统中,是不是int也是64位了呢?跑个程序验证一下。
本文主要讨论C/C++语言和Golang,因为解释性的语言对于这个并不需要关心。

结论

不想看下面内容的可以直接看结论。
大部分的变量并没有区别,比如char是8位,double是64个位。
最关键的是int和指针变量,从测试看,常用的系统(windows/Linux)都是兼容32位系统的标准,但是在C/C++的标准里,并没有定义变量长度,所以最终是由编译器决定的。更详细的分析,可以看这篇博客 参考文档
不过我们最常用的其实也是X86平台,Linux和windows,所以姑且可以认为是统一的标准。还不放心就只能到平台上试跑下了。

C/C++

类型\平台32位平台,32位编译器64位平台,64位编译器
int32位32位
指针(比如*int)32位64位

64位平台,64位编译器下,int长度是32.

Golang

类型\平台32位平台,32位编译器64位平台,64位编译器
int32位64位
int6464位64位

64位平台,64位编译器下,int长度是64.

分析

64位系统下为什么指针变成64位了?

64位系统和32位系统的区别在于数据存取的宽度。指针的作用是用于指向内存地址的,自然需要兼容系统。
所以千万注意,不要把指针传给int

用int和int64在64位系统下性能上有区别么?

没必要用int64时,还是用int比较好。虽说读取之类的单指令周期二者没什么区别,但如果需要多指令的运算,比如取模,int64所需的计算量会增多。
另外,用int64更占用内存。

验证

C语言的变量长度

查看方法

测试

#include <iostream>
#include "stdio.h"
using namespace std;

int main()
{
   printf("char %ld\n",sizeof(char));
   printf("int %ld\n",sizeof(int));
   printf("long %ld\n",sizeof(long));
   printf("long long %ld\n",sizeof(long long));
   return 0;
}

64位Linux输出

char 1
int 4
long 8
long long 8

sizeof输出的单位是byte。一个byte是8位。

Golang语言变量长度

测试

package main

import "fmt"
import "unsafe"

func main() {
    var x int
    var y int32
    var z int64
    fmt.Printf("int %d\n", unsafe.Sizeof(x))
    fmt.Printf("int32 %d\n", unsafe.Sizeof(y))
    fmt.Printf("int64 %d\n", unsafe.Sizeof(z))
}

输出

int 8
int32 4
int64 8

可以看出,64位平台,golang的int是64位长度

© 版权声明
THE END
广告
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情

    暂无评论内容