基本数据类型
基本数据类型包括整数类型和浮点数类型。
整数类型类型名称size占位符典型值/示例char字符型1字节%c'a' '\n' '1'
signed char有符号字符型1字节%hhdSCHAR_MIN SCHAR_MAX
short短整型2字节%hd123 SHORT_MIN SHORT_MAX
int整型4字节%d123 INT_MIN INT_MAX
long长整型4字节%ld123l LONG_MIN LONG_MAX
long long长长整型8字节%lld123ll LLONG_MIN LLONG_MAX
unsigned char无符号字符型1字节%hhu123 0 UCHAR_MAX
unsigned short无符号短整型1字节%hu123 0 USHORT_MAX
unsinged int无符号整型4字节%u123u 0 UINT_MAX
unsinged long无符号长整型4字节%lu123l 0 ULONG_MAX
unsinged long long无符号长长整型8字节%llu123ull ULLONG_MAX
浮点数类型类型名称size占位符典型值/示例float单精度浮点型4字节%f/%E1.0f 1.0F 1e2f 1E2f FLT_MIN FLT_MAX
double双进度浮点型8字节%f/%E1.0 .123 1e2 1E2 DBL_MIN DBL_MAX
long double长(多)精度浮点型8字节%Lf/%ELDBL_MIN LDBL_MAX
以上的数据类型size是在用于x86 的 Microsoft (R) C/C++ 优化编译器 19.11.25547 版cl下测试得到的,在其他编译平台下可能有差异。
char
一般用于存放一个字符,但是实际上他是普通的整数类型, cl变压器默认情况下等价signed char,在少数编译下默认为unsigned char。
整数值0~127都有对应可见字符或者控制符,可以查看ASCII码表获得对应关系。char c1 = 'A';
printf("c1=%c c1(dec)=%d\r\n", c1);
signed char
有符号整数类型,大部分编译器为一个字节。对应是无符号类型为unsigned char。signed char a = 1, b=2;
signed char c = a + b;
printf("c=%hhd", c);
short
和short int或者signed short int是等价的。大部分编译器为2个字节。对应的无符号类型为unsigned short或者nsigned short int。short a = 1, b=2;
short c = a + b;
printf("c=%hd", c);
int
和signed int等价,在大多数编译器下为4/8字节。对应的无符号类型为unsigned或者unsigned int。int a = 1, b=2;
int c = a + b;
printf("c=%d", c);
long
等价于signed long int,在大多数编译器下为4/8字节。对应的无符号类型为unsigned long或者unsigned long int。long a = 1, b=2;
long c = a + b;
printf("c=%ld", c);
long long
等价于signed long long int,在大多少编译器下为8字节。对应的无符号类型为unsigned long long或者unsigned long long intlong long a = 1, b=2;
long long = a + b;
printf("c=%lld", c);
float
单精度浮点数。4个字节。float a = 1.1f, b=2.1f;
float c = a + b;
printf("c=%f", c);
double
双精度浮点数。8个字节。double a = 1.1, b=2.1;
double c = a + b;
printf("c=%f", c);
long double
(略)
有符号和无符号
signed char/short/...的类型位有符号的整数类型,signed常常缺省不写,unsigned char/short/int/...为无符号整数。
值特点
有符号整数类型可以存储0、正数和负数,无符号只可以存储0和正数。
符号位
有符号类型高位存储符号位(sign)表示正负,0为正,1为负,当为正数时,剩下的位数存储正数值,当为负数时,剩下的位数存储负数绝对值的补码(取反加1)。特殊情况:所有位为0时代表0,符号位为1,其他位都是0时代表该类型所能存储的最小负值。
数据类型的size
不同类型可能有不同的size,可以用sizeof获得某种类型的size,sizeof返回的结果是size_t类型的,使用%z占位符。printf("char size=%z\r\n", sizeof(char));
printf("short size=%z\r\n", sizeof(short));
printf("int size=%z\r\n", sizeof(int));
类型size特点:数据类型的size和编译器和编译目标程序的位数有关,和编译器与目标程序运行的操作系统位数无关。但是C语言标准有基本的要求:long long 大于等于 long 大于等于 int 大于等于 short 大于等于 char。
unsigned和signed只会影响类型的符号位,不会影响类型的size,比如signed int和unsigned int的size是一样的。
类型的值范围
不同类型数值类型可存储的值范围是不同的。超出该类型的所能存储范围都会出现溢出。
下面为获取值范围的方法示例代码片段,注意获取整数类型范围定义需要包含limits.h,而浮点数需要获取值范围和精度定义需要包含float.h。#include
....
printf("signed char min=%hhd\r\n", CHAR_MIN);
printf("signed char max=%hhd\r\n", CHAR_MAX);
printf("short min=%hd\r\n", SHORT_MIN);
printf("short max=%hd\r\n", SHORT_MAX);
.......
#include
....
printf("float min=%f\r\n", FLT_MIN);
printf("float max=%f\r\n", FLT_MAX);
printf("double min=%f\r\n", DBL_MIN);
printf("double max=%f\r\n", DBL_MAX);
.......
使用16进制16进制字面量
C语言在16进制数字前添加0x前缀,以和其他进制的数字区别,比如16进制的值123要表示为0x123。16进制格式化输出
printf支持将各种整型值格式化输出为16进制数,其占位符号为%x或者%X,使用x将输出小写(a~f),使用X将输出大写(A~F)。常用%02X、%04X、%08X、%16X,即加上长度限制,用于对应输出1个字节、2个字节4个字节、8个字节的整数。
使用16进制更能反映变量内存的真实情况,比如下面例子:signed char i1 = 0x80;
printf("i1 = %d, i1(hex)=%02x", i1, i1);
头文件所在目录
limits.h:D:\Software\SDK\vs2017\VC\Tools\MSVC\14.11.25503\include注意D:\Software\SDK\vs2017是vs2017安装目录。
stdio.hC:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt
float.hC:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt