摘要
刚学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位编译器 |
---|---|---|
int | 32位 | 32位 |
指针(比如*int) | 32位 | 64位 |
64位平台,64位编译器下,int长度是32.
Golang
类型\平台 | 32位平台,32位编译器 | 64位平台,64位编译器 |
---|---|---|
int | 32位 | 64位 |
int64 | 64位 | 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
广告
暂无评论内容