自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件
自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

前言

重温C语言相关基本知识,记录一下基本数据类型相关内容,方便自己查询和回顾。

  1. 只是简单记录,不涉及深入知识

  2. 代码来自参考文1

正文

C语言支持两种不同的数值类型:整数类型(也称整型)和浮点类型(也称浮点型)。

整数类型

C语言中整数类型包括intshortlonglong long布尔字符等,除了字符与布尔类型以外,其他所有整数类型都支持带符号与无符号的表示方式。

int类型

用关键字int声明的一个整数对象具有int类型。

整数字面量可以分别使用八进制、十进制以及十六进制的方式进行表达。

int一般占32个字节。其最大值和最小值要分有符号和无符号来说。

  1. 有符号

    signed int数据的最小值:-2^31 (即0x80000000)

    signed int数据的最大值:2^31-1 (即0x7FFFFFFF)

    1. signed int a = 10;
    2. //signed可以省略
    3. int a = 10;
    复制
  2. 无符合

    unsigned int数据的最小值:0

    unsigned int数据的最大值:2^32-1 (即0xFFFFFFFF)

    1. unsigned int a= 10 ;
    2. //int可以省略
    3. unsigned a= 10 ;
    复制

打印最大值和最小值:

  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main(int argc, const char * argv[]){
  4. //int 最小值
  5.   printf("INT_MIN = %d\n", INT_MIN);  
  6.   //int 最大值
  7.   printf("INT_MAX = %d\n", INT_MAX);
  8.   //unsigned int的最大值
  9.   printf("UINT_MAX = %u\n", UINT_MAX);
  10. }
复制
short类型

短整型,标准表达为signed short int类型,其中signed与int均可省略。

  1. short a ;
复制

short一般占16个字节。其最大值和最小值也要分有符号和无符号来说。

  1. 有符号

    默认是有符号的。

    short数据的最小值:-2^15(即0x8000)

    short数据的最大值:2^15-1(即0x7FFF)

  2. 无符号

    short数据的最小值:0

    short数据的最大值:2^16-1(即0xFFFF)

short类型与unsigned short类型没有特别对应的整数字面量,它们可直接用int与unsigned int相应的整数字面量进行赋值。

打印最大值和最小值

  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main(int argc, const char * argv[]){
  4. //short 最小值
  5.   printf("SHRT_MIN = %d\n", SHRT_MIN);
  6.   //short 最大值
  7.   printf("SHRT_MAX = %d\n", SHRT_MAX);
  8.   //unsigned short最大值
  9.   printf("USHRT_MAX = %u\n", USHRT_MAX);
  10. }
复制
long类型

长整型,标准表达为signed long int类型,其中signed与int均可省略。

也分有符号和无符号。

  1. //有符号
  2. long a = 100;
  3. //有符号,加上后缀L,表示一个long类型的字面值
  4. signed long int b = 100L;
  5. //无符号
  6. unsigned long a = 100;
  7. unsigned long b = 100L;
复制

打印最大值和最小值

  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main(int argc, const char * argv[]){
  4. // long 最小值
  5.   printf("LONG_MIN = %ld\n", LONG_MIN);
  6.   // long 最大值
  7.   printf("LONG_MIN = %ld\n", LONG_MAX);
  8.   //unsigned long最大值
  9.   printf("ULONG_MAX = %lu\n", ULONG_MAX);
  10. }
复制
long long类型
  1. 有符号

标准表达为signed long long int,其中signed与int可省

  1. long long a = 100;
  2. //加上LL表示long long类型的字面值
  3. long long b = 100LL;
复制

long long的宽度均为8个字节(即64位)。其最小值为-2^63,最大值为2^63-1。

  1. 无符号

无符号标准表达为unsigned long long int, int可省,因此写为:

  1. unsigned long long a = 100;
  2. unsigned long long b = 100LL;
复制

打印最大值和最小值

  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. int main(int argc, const char *argv[]){
  5. //long long类型的最小值
  6. printf("LLONG_MIN = %lld\n", LLONG_MIN);
  7. //long long类型的最大值
  8. printf("LLONG_MAX = %lld\n", LLONG_MAX);
  9. //unsigned long long类型的最大值
  10. printf("ULLONG_MAX = %llu\n", ULLONG_MAX);
  11. }
复制
布尔类型

布尔类型用于表达真假逻辑关系,一般用true表示真,false表示假。

C语言从C99标准开始就引入了<stdbool.h>头文件,里面用bool这个宏来定义_Bool,用true定义为1, false定义为0。

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. int main(int argc, const char * argv[]){
  5. bool a = true;
  6. bool b = false;
  7. //声明了一个布尔对象c,并用a与b是否相等的比较结果对它初始化
  8. bool c = a == b; //这里c为假
  9. printf("c = %d\n", c); //输出c = 0
  10. //用a ! = b(a不等于b)的比较结果给对象c
  11. c = a ! = b;
  12. printf("a! =b的结果:%d\n", c); //输出1
  13. c = 10 > 5;
  14. printf("10 > 5? %d\n", c); //输出1
  15. c = 10 < 5;
  16. printf("10 < 5? %d\n", c); //输出0
  17. //0x10000000不为0,为真,赋值为true
  18. a = 0x10000000;
  19. printf("a = %d\n", a); //输出1
  20. //0==0,为假,赋值为false
  21. b = 0.0;
  22. printf("b = %d\n", b); //输出0
  23. }
复制
字符类型

字符类型的关键字char,用于存储字母、数字和一些特殊符号。

  1. char a = 'a';
复制

注意事项:

  1. 字符常量的定界符为单引号,即只能用单引号括起来,不能用双引号或其他符号。

  2. 一对单引号中只能包括一个字符,不能是多个字符。

  3. 字符可以是ASCII码中的任意字符。

char也分有符号和无符号。

char型数据取值范围为-128~127,unsigned char型数据取值范围为0~255。

  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. int main(int argc, const char * argv[])
  5. {
  6. signed char a = 100; //声明了一个带符号8位整数对象a
  7. signed char b = -10; //声明了一个带符号8位整数对象b
  8. printf("a - b = %d\n", a - b); //结果输出110
  9.  
  10. unsigned char c = 200; //声明了一个无符号8位整数对象c
  11. unsigned char d = 50; //声明了一个无符号8位整数对象d
  12. printf("c - d = %d\n", c - d); //输出结果150
  13.  
  14. //输出signed char的最小值
  15. printf("SCHAR_MIN = %d\n", SCHAR_MIN);
  16.  
  17. //输出signed char的最大值
  18. printf("SCHAR_MAX = %d\n", SCHAR_MAX);
  19.  
  20. //输出unsigned char的最大值
  21. printf("UCHAR_MAX = %d\n", UCHAR_MAX);
  22.  
  23. char ch = 'a'; //声明一个字符对象ch,并用字符’a’对它初始化
  24. printf("ch = %c\n", ch); //输出a
  25.  
  26. //对于多字符的字符字面量,某些编译器会给出警告
  27. //这里会将int类型的字符字面量’abc’截取其最低字节’c’给对象ch
  28. //其他高字节部分被舍弃
  29. ch = 'abc';
  30. printf("ch = %c\n", ch); //输出c
  31.  
  32. //这里不会有警告,并且
  33. //字符a位于对象s的最低字节位置,字符\0位于对象s的最高字节位置
  34. int s = '\0cba';
  35. printf("s = %s\n", (char*)&s); //输出abc
  36.  
  37. //八进制数060相当于十六进制数0x30,对应于ASCII码的罗马数字0
  38. ch = '\060';
  39. printf("ch = %c\n", ch); //输出0
  40.  
  41. //八进制数0101相当于十六进制数0x41,对应于ASCII码的大写字母A
  42. ch = '\101';
  43. printf("ch = %c\n", ch); //输出A
  44.  
  45. ch = '\x42'; //十六进制数0x42对应于ASCII码中的大写字母B
  46. printf("ch = %c\n", ch); //输出B
  47.  
  48. //无效的转义符,在Clang中此时ch的值为'8'
  49. //因为八进制数中的每一位数都是在0到7的范围内
  50. ch = '\8';
  51.  
  52. //无效的转义符,在Clang编译器中直接编译报错
  53. //因为字母g不是一个能表达十六进制数的有效字符
  54. ch = '\xg0';
  55.  
  56. //输出char类型的最小值
  57. printf("CHAR_MIN = %d\n", CHAR_MIN);
  58.  
  59. //输出char类型的最大值
  60. printf("CHAR_MAX = %d\n", CHAR_MAX);
  61. }
复制

浮点类型

C语言中有3种实数浮点类型,分别为floatdouble与long double。

C语言标准仅仅规定了float类型的精度是double类型精度的子集;double类型精度是long double精度的子集。

  1. 在十进制浮点数后面添加f或F后缀,表示该字面量是float类型浮点数;

  2. 不添加任何后缀表示double类型浮点字面量;

  3. 添加l或L后缀表示long double类型的浮点字面量。

如果浮点数的小数部分为0,那么我们也可以写为:10.,-5.等形式,10.相当于10.0。

同样,如果整数部分为0,那么我们也可以写作为.25、.1001等形式,.25相当于0.25。

C语言还引入了对浮点数的科学计数法的表示。

  1. //e或E都是一样的意思,不同的写法
  2. 3e5 = 3*10^5
  3. 3E5 = 3*10^5
  4.  
  5. 6e-3 = 6*10^-3
  6. 6E-3 = 6*10^-3
复制

C语言还引入了十六进制浮点表示法,即一个十六进制数跟p或P,再跟一个十进制数,表示p或P之前的十六进制数乘以2p之后的数。

p或P的左边必须是一个十六进制整数或浮点数,p或P的右边必须是一个十进制整数,并且十六进制浮点数表示中,p与指数部分不可缺省。

  1. 0x3P2 = 0x3*2^2
  2. 0x3.5P-3 = 0x3.5*2^-3
复制

下面介绍一下p的使用,以0x30.8p-2为例

百度AI助手写的。

  1. 0x30.8p-2
  2.  
  3. 0x30.8:这是十六进制下的浮点数表示方式,其中0x表示这是一个十六进制数。30是小数点前的部分,而.8是小数点后的部分。
  4.  
  5. p-2:这是表示指数的部分,其中p代表“power”或“power of”,用于指定指数。这里的-2表示指数是-2
  6.  
  7. 分离整数和小数部分:
  8.  
  9. 整数部分:0x30(即十进制的48
  10.  
  11. 小数部分:.8(即十六进制下的0.5,因为816的一半)
  12.  
  13. 合并并转换为十进制:
  14.  
  15. 首先将整数部分和带小数部分的十六进制数合并(不包括前面的0x和后面的p-2):30.8
  16.  
  17. 然后转换为十进制:
  18.  
  19. 整数部分:48
  20.  
  21. 小数部分:0.5(因为8在十六进制中是16的一半)
  22.  
  23. 合并后:48 + 0.5 = 48.5
  24.  
  25. 应用指数:
  26.  
  27. 根据指数p-2,我们需要将48.5乘以2的-2次方。
  28.  
  29. 2的-2次方等于0.25(即1/4)。
  30.  
  31. 因此,48.5乘以0.25等于12.125
  32.  
  33. 最终结果
  34.  
  35. 所以,0x30.8p-2在十进制下等于12.125
复制

Demo

  1. #include <stdio.h>
  2. #include <float.h>
  3.  
  4. int main(int argc, const char * argv[]){
  5. //定义一个单精度浮点数对象f
  6. float f = -3.5E+3f; //f的值为3.5 * 1000 = -3500.0。这里的+表示正号,可省
  7. printf("f = %f\n", f);
  8.  
  9. f = .25f; //f的值为0.25
  10. printf("f = %f\n", f);
  11.  
  12. f = -0x5p+10f; //f的值为-5 * 1024 = -5120
  13. printf("f = %f\n", f);
  14.  
  15. //定义了一个双精度浮点对象d
  16. double d = -100.; //d的值为-100.0
  17. printf("d = %f\n", d);
  18.  
  19. d = -1200e-5; //d的值为-1200 * 0.00001 = -0.012
  20. printf("d = %f\n", d);
  21.  
  22. d = 0x30.8p-2; //d的值为0x30.8 * 0.25 = 48.5 * 0.25 = 12.125
  23. printf("d = %f\n", d);
  24.  
  25. //定义一个long double类型的对象g
  26. long double g = -0x3.5P0L; //g的值为-0x3.5 * 1 = -3.3125
  27. printf("g = %Lf\n", g);
  28.  
  29. g = 0x18.F8P2L * 2E3L; //(24+0.96875)*4 * 2*1000 = 199750.0
  30. printf("g = %Lf\n", g);
  31.  
  32. printf("long double size is: %zu bytes\n", sizeof(g));
  33.  
  34. //以下都是用浮点数的科学计数法来打印出各种类型浮点数的最大、最小值
  35. printf("float min value is: %g\n", FLT_MIN);
  36. printf("float max value is: %g\n", FLT_MAX);
  37.  
  38. printf("double min value is: %g\n", DBL_MIN);
  39. printf("double max value is: %g\n", DBL_MAX);
  40.  
  41. printf("long double min value is: %Lg\n", LDBL_MIN);
  42. printf("long double max value is: %Lg\n", LDBL_MAX);
  43. }
复制

参考文章

  1. 《C语言编程魔法书:基于C11标准》

  2. 《C语言程序设计:现代方法(第2版)》

  3. 《百度AI助手》

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

相关文章

自动化零件服务商 - 供应SMC,FESTO,CKD全新正品气动元件

暂无评论

none
暂无评论...