基本数据类型字节数
最近接触了C发现真是强大,然而实在是难学,就数据类型的字节数都那么多道道,我体会到《从入门到放弃》是什么感觉了……
References:
- https://zh.cppreference.com/w/cpp/language/types
- https://www.tutorialspoint.com/cprogramming/c_data_types.htm
- https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html
- 《C程序设计语言(第二版)》
- http://blog.csdn.net/lyl0625/article/details/7350045
- http://blog.csdn.net/a775992553/article/details/8790241
- http://blog.csdn.net/litong09282039/article/details/46348265
C语言标准并未明确说明各种类型的字节数,但是规定了最小的取值范围,实际长度和机器字长、编译器有关,如果需要具体平台的实际字节数,可通过sizeof
获取。而且对于整形数据只规定了short占用的空间不能多于int,long占用的空间不能少于int。Java则保证了全平台一致性,与其追求的“一次编写,到处运行(Write once, run anywhere)”目标一致。下面大致将两种语言的基本类型的字节数作了下对比,由于C语言的平台较多,且不同平台间差异较大,这里只表示常见情况下的数据。
数据类型 | char | byte | short | int | long | long long | float | double | boolean | char* |
---|---|---|---|---|---|---|---|---|---|---|
Java | 2 | 1 | 2 | 4 | 8 | / | 4 | 8 | 1 | / |
C | 1 | / | 2 | 2或4 | 4或8 | 8 | 4 | 8 | 1(C99中的_Bool) | 2 |
由于各平台可能会出现些许的差异,如果想跨平台一致就可以用到<stdint.h>
这么个神奇的东西,该头文件中定义了指定长度的整数类型或不少于制定长度的整数类型,使其通过定义此头文件中的类型即可保证各平台的基本一致,方便程序跨平台使用,其中部分内容如下:
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef signed char int_least8_t;
typedef short int_least16_t;
typedef int int_least32_t;
typedef long long int_least64_t;
typedef unsigned char uint_least8_t;
typedef unsigned short uint_least16_t;
typedef unsigned int uint_least32_t;
typedef unsigned long long uint_least64_t;
typedef signed char int_fast8_t;
typedef int int_fast16_t;
typedef int int_fast32_t;
typedef long long int_fast64_t;
typedef unsigned char uint_fast8_t;
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
typedef unsigned long long uint_fast64_t;
typedef long long intmax_t;
typedef unsigned long long uintmax_t;
唉,真复杂……