C/C++基本数据类型

前言

C/C++程序也写了有几年了,但被问起详细的C/C++数据类型,所占内存空间,以及数据类型隐式/显示转换时,有些还是模棱两可,本文做深入的探讨。

基本数据类型

在之前写MCU程序时经常会用到char、short、unsigned short、int等类型,在后面写Linux程序时,用到int、long、long long、float、double等类型、以为C/C++有这么多基本数据类型,仔细研究才发现,其实C/C++的基本数据类型就3种:

  1. 字符型char:
    在 C 语言中,char 是基本的字符类型,用于存储单个字符,通常占 1 个字节,实际上它存储的是字符对应的 ASCII 码值,可以像整数一样参与运算,例如 char c = ‘A’。

  2. 整型int:
    上面说的short、unsigned short、signed、unsigned、int、long、long long都是整形,例如short其实是short int简写为short,long其实是long int简写为long,其他同理,后面都跟一个int,所以都是int类型。

  3. 浮点型float/double:
    浮点型分为float(单精度浮点型)和double(双精度浮点型)还有long double(长双精度浮点型),浮点型用于表示带有小数部分的数值以及进行科学计数法形式的数值运算等情况。

特别说明:上面所说的int类型中signed, unsigned都隐含了int, 等价于signed int, unsigned int,但注意char没有这种默认等价性。char不和signed char或者unsigned char其中任何一个等价。如果用于文本,则使用未加限定的char, 是类似于 ‘a’, '0’的类型, 或是组成C字符串"abcde"的类型。它也可以是一个值,但是是当做无符号还是有符号数没有指定。 如果用于数字,那么: signed char, 范围 -128 到 127,unsigned char, 范围 0 ~ 255。char的默认类型不确定,有可能是unsigned,也有可能是signed,主要更具编译器而定。

数据类型长度

C/C++ 中不同目标平台下各数据类型长度是不同的,数据类型的实际长度由编译器在编译期间通过编译参数指定目标平台而确定的。 short int,int,long int 的字节数都是随编译器指定的目标平台而异,但是在ANSI/ISO指定:无论什么平台都要保证long型占用字节数不小于int型, int型不小于short型,即:

  1. sizeof(short int) <= sizeof(int)
  2. sizeof(int) <= sizeof(long int)
  3. sizeof(short int) >= 16 bit (2 Byte)
  4. sizeof(long int) >= 32 bit (4 Byte)

16bit 编译器:

类型长度范围
char1 Byte-
unsigned char1 Byte0~255
signed char1 Byte-128~127
unsigned short int / unsigned short2 Byte0~65535
signed short int / short int / short2 Byte-32768~32767
unsigned int / unsigned2 Byte0~65535
signed int / signed / int2 Byte-32768~32767
unsigned long int / unsigned long4 Byte0~4294967295
signed long int / signed long / long4 Byte-2147483648~2147483647
signed long long int / signed long long / long long8 Byte-9223372036854775808~9223372036854775807
unsigned long long int / unsigned long long8 Byte0~18446744073709551615
float4 Byte1.17549e-38 ~ 3.40282e+38
double8 Byte2.22507e-308 ~ 1.79769e+308

32bit 编译器:

类型长度范围
char1 Byte-
unsigned char1 Byte0~255
signed char1 Byte-128~127
unsigned short int / unsigned short2 Byte0~65535
signed short int / short int / short2 Byte-32768~32767
unsigned int / unsigned4 Byte0~4294967295
signed int / signed / int4 Byte-2147483648~2147483647
unsigned long int / unsigned long4 Byte0~4294967295
signed long int / signed long / long4 Byte-2147483648~2147483647
signed long long int / signed long long / long long8 Byte-9223372036854775808~9223372036854775807
unsigned long long int / unsigned long long8 Byte0~18446744073709551615
float4 Byte1.17549e-38 ~ 3.40282e+38
double8 Byte2.22507e-308 ~ 1.79769e+308

64bit 编译器:

类型长度范围
char1 Byte-
unsigned char1 Byte0~255
signed char1 Byte-128~127
unsigned short int / unsigned short2 Byte0~65535
signed short int / short int / short2 Byte-32768~32767
unsigned int / unsigned4 Byte0~4294967295
signed int / signed / int4 Byte-2147483648~2147483647
unsigned long int / unsigned long8 Byte0~18446744073709551615
signed long int / signed long / long8 Byte-9223372036854775808~9223372036854775807
signed long long int / signed long long / long long8 Byte-9223372036854775808~9223372036854775807
unsigned long long int / unsigned long long8 Byte0~18446744073709551615
float4 Byte1.17549e-38 ~ 3.40282e+38
double8 Byte2.22507e-308 ~ 1.79769e+308

指针变量

指针变量所占字节数是根据编译器的寻址空间决定宽度的:

16 bit编译器寻址空间为16 bit,所以指针变量宽度为2 Byte
32 bit编译器寻址空间为32 bit,所以指针变量宽度为4 Byte
64 bit编译器寻址空间为64 bit,所以指针变量宽度为8 Byte

补充

在C里面经常看到size_t的数据类型,这是一种自定义的数据类型。size_t是标准C库中定义的,在64位系统中为long unsigned int,非64位系统中为 unsigned int。

关于数据类型转换,可查看另一篇文章:C/C++数据类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值