前言
重温C语言相关基本知识,记录一下基本数据类型相关内容,方便自己查询和回顾。
只是简单记录,不涉及深入知识
代码来自参考文1
正文
整数类型
C语言中整数类型包括int、short、long、long long、布尔、字符等,除了字符与布尔类型以外,其他所有整数类型都支持带符号与无符号的表示方式。
int类型
用关键字int声明的一个整数对象具有int类型。
整数字面量可以分别使用八进制、十进制以及十六进制的方式进行表达。
int一般占32个字节。其最大值和最小值要分有符号和无符号来说。
有符号
signed int数据的最小值:-2^31 (即0x80000000)
signed int数据的最大值:2^31-1 (即0x7FFFFFFF)
signed int a = 10; //signed可以省略 int a = 10;
无符合
unsigned int数据的最小值:0
unsigned int数据的最大值:2^32-1 (即0xFFFFFFFF)
unsigned int a= 10 ; //int可以省略 unsigned a= 10 ;
打印最大值和最小值:
#include <stdio.h> #include <limits.h> int main(int argc, const char * argv[]){ //int 最小值 printf("INT_MIN = %d\n", INT_MIN); //int 最大值 printf("INT_MAX = %d\n", INT_MAX); //unsigned int的最大值 printf("UINT_MAX = %u\n", UINT_MAX); }
short类型
短整型,标准表达为signed short int类型,其中signed与int均可省略。
short a ;
short一般占16个字节。其最大值和最小值也要分有符号和无符号来说。
有符号
默认是有符号的。
short数据的最小值:-2^15(即0x8000)
short数据的最大值:2^15-1(即0x7FFF)
无符号
short数据的最小值:0
short数据的最大值:2^16-1(即0xFFFF)
short类型与unsigned short类型没有特别对应的整数字面量,它们可直接用int与unsigned int相应的整数字面量进行赋值。
打印最大值和最小值
#include <stdio.h> #include <limits.h> int main(int argc, const char * argv[]){ //short 最小值 printf("SHRT_MIN = %d\n", SHRT_MIN); //short 最大值 printf("SHRT_MAX = %d\n", SHRT_MAX); //unsigned short最大值 printf("USHRT_MAX = %u\n", USHRT_MAX); }
long类型
长整型,标准表达为signed long int类型,其中signed与int均可省略。
也分有符号和无符号。
//有符号 long a = 100; //有符号,加上后缀L,表示一个long类型的字面值 signed long int b = 100L; //无符号 unsigned long a = 100; unsigned long b = 100L;
打印最大值和最小值
#include <stdio.h> #include <limits.h> int main(int argc, const char * argv[]){ // long 最小值 printf("LONG_MIN = %ld\n", LONG_MIN); // long 最大值 printf("LONG_MIN = %ld\n", LONG_MAX); //unsigned long最大值 printf("ULONG_MAX = %lu\n", ULONG_MAX); }
long long类型
有符号
标准表达为signed long long int,其中signed与int可省
long long a = 100; //加上LL表示long long类型的字面值 long long b = 100LL;
long long的宽度均为8个字节(即64位)。其最小值为-2^63,最大值为2^63-1。
无符号
无符号标准表达为unsigned long long int, int可省,因此写为:
unsigned long long a = 100; unsigned long long b = 100LL;
打印最大值和最小值
#include <stdio.h> #include <limits.h> int main(int argc, const char *argv[]){ //long long类型的最小值 printf("LLONG_MIN = %lld\n", LLONG_MIN); //long long类型的最大值 printf("LLONG_MAX = %lld\n", LLONG_MAX); //unsigned long long类型的最大值 printf("ULLONG_MAX = %llu\n", ULLONG_MAX); }
布尔类型
布尔类型用于表达真假逻辑关系,一般用true表示真,false表示假。
C语言从C99标准开始就引入了<stdbool.h>头文件,里面用bool这个宏来定义_Bool,用true定义为1, false定义为0。
#include <stdio.h> #include <stdbool.h> int main(int argc, const char * argv[]){ bool a = true; bool b = false; //声明了一个布尔对象c,并用a与b是否相等的比较结果对它初始化 bool c = a == b; //这里c为假 printf("c = %d\n", c); //输出c = 0 //用a ! = b(a不等于b)的比较结果给对象c c = a ! = b; printf("a! =b的结果:%d\n", c); //输出1 c = 10 > 5; printf("10 > 5? %d\n", c); //输出1 c = 10 < 5; printf("10 < 5? %d\n", c); //输出0 //0x10000000不为0,为真,赋值为true a = 0x10000000; printf("a = %d\n", a); //输出1 //0==0,为假,赋值为false b = 0.0; printf("b = %d\n", b); //输出0 }
字符类型
字符类型的关键字char,用于存储字母、数字和一些特殊符号。
char a = 'a';
注意事项:
字符常量的定界符为单引号,即只能用单引号括起来,不能用双引号或其他符号。
一对单引号中只能包括一个字符,不能是多个字符。
字符可以是ASCII码中的任意字符。
char也分有符号和无符号。
char型数据取值范围为-128~127,unsigned char型数据取值范围为0~255。
#include <stdio.h> #include <limits.h> int main(int argc, const char * argv[]) { signed char a = 100; //声明了一个带符号8位整数对象a signed char b = -10; //声明了一个带符号8位整数对象b printf("a - b = %d\n", a - b); //结果输出110 unsigned char c = 200; //声明了一个无符号8位整数对象c unsigned char d = 50; //声明了一个无符号8位整数对象d printf("c - d = %d\n", c - d); //输出结果150 //输出signed char的最小值 printf("SCHAR_MIN = %d\n", SCHAR_MIN); //输出signed char的最大值 printf("SCHAR_MAX = %d\n", SCHAR_MAX); //输出unsigned char的最大值 printf("UCHAR_MAX = %d\n", UCHAR_MAX); char ch = 'a'; //声明一个字符对象ch,并用字符’a’对它初始化 printf("ch = %c\n", ch); //输出a //对于多字符的字符字面量,某些编译器会给出警告 //这里会将int类型的字符字面量’abc’截取其最低字节’c’给对象ch //其他高字节部分被舍弃 ch = 'abc'; printf("ch = %c\n", ch); //输出c //这里不会有警告,并且 //字符a位于对象s的最低字节位置,字符\0位于对象s的最高字节位置 int s = '\0cba'; printf("s = %s\n", (char*)&s); //输出abc //八进制数060相当于十六进制数0x30,对应于ASCII码的罗马数字0 ch = '\060'; printf("ch = %c\n", ch); //输出0 //八进制数0101相当于十六进制数0x41,对应于ASCII码的大写字母A ch = '\101'; printf("ch = %c\n", ch); //输出A ch = '\x42'; //十六进制数0x42对应于ASCII码中的大写字母B printf("ch = %c\n", ch); //输出B //无效的转义符,在Clang中此时ch的值为'8' //因为八进制数中的每一位数都是在0到7的范围内 ch = '\8'; //无效的转义符,在Clang编译器中直接编译报错 //因为字母g不是一个能表达十六进制数的有效字符 ch = '\xg0'; //输出char类型的最小值 printf("CHAR_MIN = %d\n", CHAR_MIN); //输出char类型的最大值 printf("CHAR_MAX = %d\n", CHAR_MAX); }
浮点类型
C语言中有3种实数浮点类型,分别为float、double与long double。
C语言标准仅仅规定了float类型的精度是double类型精度的子集;double类型精度是long double精度的子集。
在十进制浮点数后面添加f或F后缀,表示该字面量是float类型浮点数;
不添加任何后缀表示double类型浮点字面量;
添加l或L后缀表示long double类型的浮点字面量。
如果浮点数的小数部分为0,那么我们也可以写为:10.,-5.等形式,10.相当于10.0。
同样,如果整数部分为0,那么我们也可以写作为.25、.1001等形式,.25相当于0.25。
C语言还引入了对浮点数的科学计数法的表示。
//e或E都是一样的意思,不同的写法 3e5 = 3*10^5 3E5 = 3*10^5 6e-3 = 6*10^-3 6E-3 = 6*10^-3
C语言还引入了十六进制浮点表示法,即一个十六进制数跟p或P,再跟一个十进制数,表示p或P之前的十六进制数乘以2p之后的数。
p或P的左边必须是一个十六进制整数或浮点数,p或P的右边必须是一个十进制整数,并且十六进制浮点数表示中,p与指数部分不可缺省。
0x3P2 = 0x3*2^2 0x3.5P-3 = 0x3.5*2^-3
下面介绍一下p的使用,以0x30.8p-2为例
百度AI助手写的。
0x30.8p-2 0x30.8:这是十六进制下的浮点数表示方式,其中0x表示这是一个十六进制数。30是小数点前的部分,而.8是小数点后的部分。 p-2:这是表示指数的部分,其中p代表“power”或“power of”,用于指定指数。这里的-2表示指数是-2。 分离整数和小数部分: 整数部分:0x30(即十进制的48) 小数部分:.8(即十六进制下的0.5,因为8是16的一半) 合并并转换为十进制: 首先将整数部分和带小数部分的十六进制数合并(不包括前面的0x和后面的p-2):30.8 然后转换为十进制: 整数部分:48 小数部分:0.5(因为8在十六进制中是16的一半) 合并后:48 + 0.5 = 48.5 应用指数: 根据指数p-2,我们需要将48.5乘以2的-2次方。 2的-2次方等于0.25(即1/4)。 因此,48.5乘以0.25等于12.125。 最终结果 所以,0x30.8p-2在十进制下等于12.125。
Demo
#include <stdio.h> #include <float.h> int main(int argc, const char * argv[]){ //定义一个单精度浮点数对象f float f = -3.5E+3f; //f的值为3.5 * 1000 = -3500.0。这里的+表示正号,可省 printf("f = %f\n", f); f = .25f; //f的值为0.25 printf("f = %f\n", f); f = -0x5p+10f; //f的值为-5 * 1024 = -5120 printf("f = %f\n", f); //定义了一个双精度浮点对象d double d = -100.; //d的值为-100.0 printf("d = %f\n", d); d = -1200e-5; //d的值为-1200 * 0.00001 = -0.012 printf("d = %f\n", d); d = 0x30.8p-2; //d的值为0x30.8 * 0.25 = 48.5 * 0.25 = 12.125 printf("d = %f\n", d); //定义一个long double类型的对象g long double g = -0x3.5P0L; //g的值为-0x3.5 * 1 = -3.3125 printf("g = %Lf\n", g); g = 0x18.F8P2L * 2E3L; //(24+0.96875)*4 * 2*1000 = 199750.0 printf("g = %Lf\n", g); printf("long double size is: %zu bytes\n", sizeof(g)); //以下都是用浮点数的科学计数法来打印出各种类型浮点数的最大、最小值 printf("float min value is: %g\n", FLT_MIN); printf("float max value is: %g\n", FLT_MAX); printf("double min value is: %g\n", DBL_MIN); printf("double max value is: %g\n", DBL_MAX); printf("long double min value is: %Lg\n", LDBL_MIN); printf("long double max value is: %Lg\n", LDBL_MAX); }
参考文章
《C语言编程魔法书:基于C11标准》
《C语言程序设计:现代方法(第2版)》
《百度AI助手》