fenlan

Everything gonna be fine in the end, if it's not fine, it's not the end.

0%

C++ Java基本类型size问题

鉴于之前多次面试题考察基本类型大小问题,今天来做个记录。

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
#include <iostream>
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
9
bool      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
2
3
4
5
6
7
8
9
10
11
12
public class TypeSize {

public static void main(String[] args) {
System.out.println("byte sizeof : " + Byte.SIZE);
System.out.println("char sizeof : " + Character.SIZE);
System.out.println("short sizeof : " + Short.SIZE);
System.out.println("int sizeof : " + Integer.SIZE);
System.out.println("long sizeof : " + Long.SIZE);
System.out.println("float sizeof : " + Float.SIZE);
System.out.println("double sizeof : " + Double.SIZE);
}
}

输出结果

1
2
3
4
5
6
7
byte      sizeof : 8
char sizeof : 16
short sizeof : 16
int sizeof : 32
long sizeof : 64
float sizeof : 32
double sizeof : 64