鉴于之前多次面试题考察基本类型大小问题,今天来做个记录。
C++
C++的基本类型有bool
char
short
float
double
int
long
long long
pointer(指针)
数据类型 | 32位系统字节数 | 32系统二进制位数 | 64位系统字节数 | 64位系统二进制位数 |
---|---|---|---|---|
bool | 1 | 8 | 1 | 8 |
char | 1 | 8 | 1 | 8 |
short | 2 | 16 | 2 | 16 |
int | 4 | 32 | 4 | 32 |
long | 4 | 32 | 8 | 64 |
long long | 8 | 64 | 8 | 64 |
float | 4 | 32 | 4 | 32 |
double | 8 | 64 | 8 | 64 |
pointer | 4 | 32 | 8 | 64 |
可以看出其中只有long
pointer
是不同的,32位平台32位,64位平台64位,其实pointer
就是用long
表示的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;
int main()
{
cout << "bool sizeof : " << sizeof(bool) << endl;
cout << "char sizeof : " << sizeof(char) << endl;
cout << "short sizeof : " << sizeof(short) << endl;
cout << "int sizeof : " << sizeof(int) << endl;
cout << "long sizeof : " << sizeof(long) << endl;
cout << "long long sizeof : " << sizeof(long long) << endl;
cout << "float sizeof : " << sizeof(float) << endl;
cout << "double sizeof : " << sizeof(double) << endl;
cout << "pointer sizeof : " << sizeof(void *) << endl;
return 0;
}
64位linux输出结果1
2
3
4
5
6
7
8
9bool sizeof : 1
char sizeof : 1
short sizeof : 2
int sizeof : 4
long sizeof : 8
long long sizeof : 8
float sizeof : 4
double sizeof : 8
pointer sizeof : 8
Java
Java的基本类型有boolean
char
short
float
double
int
long
byte
, Java中的基本类型大小是固定的,与操作平台位数无关
数据类型 | 字节数 | 二进制位数 |
---|---|---|
boolen | 1 | 8 |
byte | 1 | 8 |
char | 2 | 16 |
short | 2 | 16 |
int | 4 | 32 |
long | 8 | 64 |
float | 4 | 32 |
double | 8 | 64 |
值得注意的是Java中的char
类型占两个字节,而C++中只占一个字节。char
在Java中是16位的,因为Java用的是Unicode
。不过8位的ASCII码包含在Unicode
中,是从0~127的。至于为什么,这里留下一点故事 :
Java中使用Unicode的原因是,Java的Applet允许全世界范围内运行,那它就需要一种可以表述人类所有语言的字符编码。Unicode。但是English,Spanish,German, French根本不需要这么表示,所以它们其实采用ASCII码会更高效。这中间就存在一个权衡问题。
那么是不是该好奇中文字应该占多少字节,这个不同的编码不一样,通常在2-4个字节:
GBK
编码,一个汉字占两个字节UTF-16
编码,通常汉字占两个字节CJKV
扩展B区、扩展C区、扩展D区中的汉字占四个字节(一般字符的Unicode范围是U+0000至U+FFFF,而这些扩展部分的范围大于U+20000,因而要用两个UTF-16)UTF-8
编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节
1 | public class TypeSize { |
输出结果1
2
3
4
5
6
7byte sizeof : 8
char sizeof : 16
short sizeof : 16
int sizeof : 32
long sizeof : 64
float sizeof : 32
double sizeof : 64