前言
重温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助手》