C语言变量常量,基本数据类型及数据类型转换详讲(二)

简介: C语言变量常量,基本数据类型及数据类型转换详讲

4.2 浮点数的两种形式

4.2.1 十进制小数形式

📝 合法的浮点数形式举例:

double a = 520.1314; //输出520.131400
double b = 520.;     //输出520.000000
double c = 520.0;    //输出520.000000
double d = -0.1314;  //输出 -0.131400
double e = .1314;    //输出  0.131400

4.3.2 指数形式(科学计数法

C 语⾔允许使⽤科学计数法表示浮点数,使⽤字⺟ e/E 来分隔⼩数部分和指数部分。

  1. 比如 13.14e+2就等价于 13.14 ∗ 1 0 2 13.14*10^213.14102 ,即 1314
  2. 比如 13.14e-2就等价于 13.14 ∗ 1 0 − 2 13.14*10^{-2}13.14102 ,即 0.1314

📍 注意事项和细节说明:

  • e/E 后面的指数必须为整数。
  • e/E 后⾯如果是加号 + ,加号可以省略。
  • 科学计数法⾥⾯ e/E 的前后,不能存在空格。

📝 合法的浮点数形式举例:

double a = 520.13e+2; //输出 52013.000000
double b = 520.e+3;   //输出 520000.000000
double c = 520.0e-2;  //输出 5.200000
double d = .1314e4;   //输出 1314.000000

4.3 浮点型对应占位符

#include<stdio.h>
int main()
{
  float a = 2.5;
  double b = 9.99;
  long double c = 520.1314;
  printf("单精度浮点型 a = %f\n\n", a);
  printf("双精度浮点型 b = %lf\n\n", b);
  printf("长双精度浮点型 c = %llf\n\n", c);
  return  0;
}

🚩 总结

数据类型 形式 占位符
float 十进制 %f
double 十进制 %lf
long double 十进制 %llf
float 指数形式 %e 或 %E
double 指数形式 %le 或 %lE
long double 指数形式 %lle 或 %llE

4.4 注意事项和细节说明

在实际开发中,我们都不会选用单精度浮点数float,因为该类型很容易导致精度丢失,导致计算错误。我们通常会采用精度更高的double类型。

📝 我们来看一个浮点数精度不准确造成的问题:

#include<stdio.h>
int main()
{
  double a = 0.1;
  double b = 0.2;
  if (a + b == 0.3)
    printf("精度未丢失");
  else
    printf("精度丢失,a + b = %lf",a + b);
  return 0;
}

是不是就很匪夷所思,这是因为由于底层存储小数不准确问题导致在计算时 a+b 的结果其实是无限接近于0.3的,但不等于0.3,因此 a+b == 0.3 为 假(false)。

❓ 你是不是不相信我说的话呀?因为你发现 在上图的输出中 的确输出的是 0.300000 呀,但其实呀,有这样一件事我需要和你说清楚,一个女孩说对你有好感❤️ ,可你却以为她是在说喜欢你,可是这是真的吗,其实你并未看到全部,只是你的自作多情和一厢情愿罢了。这里也是一样的道理,我们在打印数据的时候默认只打印到了小数点后六位,我们修改一下打印位数:

#include<stdio.h>
int main()
{
  double a = 0.1;
  double b = 0.2;
  if (a + b == 0.3)
    printf("精度未丢失");
  else
    //我们这里是 .32lf 即打印到小数点后32位
    printf("精度丢失,a + b = %.32lf", a + b);
  return 0;
}

但是这个问题我们能够怎样解决呢?这里提供一种方式:

#include<stdio.h>
int main()
{
  double a = 0.1;
  double b = 0.2;
  if (a + b - 0.3 < 0.000001)
    printf("精度未丢失");
  else
    //我们这里是 .32lf 即打印到小数点后32位
    printf("精度丢失,a + b = %.32lf", a + b);
  return 0;
}

5.字符型

5.1 基本使用说明

  • 字符常量使用单引号 ' ' 括起来的单个字符。
  • C还允许使用转义字符\来将其后的字符转变为特殊字符型常量。

5.2 字节大小

#include<stdio.h>
int main()
{
  printf("有符号字符型的字节大小:%lld\n", sizeof(char));
  printf("无符号字符型的字节大小:%lld\n", sizeof(unsigned char));
  return  0;
}

🚩 总结

数据类型 字节大小
char 1
unsigned char 1

5.3 字符型对应占位符

数据类型 占位符
char %c
unsigned char %c

5.4 char的本质

关于更加具体的字符编码说明,查看文章:https://blog.csdn.net/qq_62982856/article/details/127440216?spm=1001.2014.3001.5502

  • 计算机在存储字符时并不是真的要存储字符实体,而是存储该字符在字符集中的编号(也可以叫编码值)。对于 char 类型来说,它实际上存储的就是字符的 ASCII 码。
  • 无论在哪个字符集中,字符编号都是一个整数;从这个角度考虑,字符类型和整数类型本质上没有什么区别。
  • 我们可以给字符类型赋值一个整数,或者以整数的形式输出字符类型。反过来,也可以给整数类型赋值一个字符,或者以字符的形式输出整数类型。

char的本质是一个整数,在输出时,是 ASCII码表中对应的字符。

  • 因此,可以直接给char赋一个整型数据,然后输出时,会按照该整数对应的ASCII字符输出。
#include<stdio.h>
int main()
{
  int b = 65;
  char a = b; //因为左边接收类型是 char,整数65对应的ASCII字符是 'A',因此 a 被赋值为 'A'
  printf("%c\n", a); // %c --> 以ASCII字符形式输出
  printf("%d\n\n", a); // %d --> 以ASCII值形式输出
  char d = 'D';
  printf("%c\n", d);
  printf("%d\n\n", d);
  return  0;
}
  • char类型是可以进行运算的,相当于一个整数(对应规则来自ASCII表)
#include<stdio.h>
int main()
{
  char a = 'A';
  char b = a + 1;//'A'对应整数 65,因此 a+1 为66,接收类型为 char,整数66对应的ASCII字符为 'B',因此 b 为 'B'
  int c = a + 1; //'A'对应整数 65,因此 a+1 为66,接受类型为 int,因此 c 为 66
  printf("%d\n", b);  // %d --> 以ASCII值形式输出
  printf("%c\n\n", b); // %c --> 以ASCII字符形式输出
  printf("%d\n", c);
  printf("%c\n\n", c);
  return  0;
}

6.补充:布尔类型 bool

6.1 C89标准

C 语言标准 C89 没有定义布尔类型,所以 C 语言判断真假时以 0 为假(false),非 0 为真(true)

#include<stdio.h>
int main()
{
  int a = -1;
  if (a) // -1 是非0数,因此if语句成立为true
    printf("非0为真\n\n");
  if (a + 1) // a+1的结果为0,因为0为假,所以if语句不成立为false
    printf("输出1:0为假\n\n");
  else //因此执行 else语句
    printf("输出2: 0为假\n\n");
  if (a + 1 == 0) // a+1为0,则0==0说明if语句成立为true
    printf("a+1为0成立\n\n");
  int b = 0;
  if (!b) // b是0,为false,!是取反操作,即false变true
    printf("取反为true输出\n\n");
  return  0;
}

相关文章
|
1月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
26天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
48 12
|
1月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
170 11
|
1月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
50 8
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
46 7
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
38 5
|
1月前
|
C语言
【C语言】<常量> 之群英荟萃
在C语言中,常量(Constants)是指在程序运行过程中其值不能被修改的固定值。常量包括数值常量(整型和浮点型)、字符常量、字符串常量、使用const关键字定义的常量变量以及枚举常量。
33 4
|
1月前
|
编译器 C语言
【C语言】常量的 “前缀和后缀” 大通关!
在C语言中,常量的前缀和后缀用于明确指定常量的类型和进制系统。前缀主要用于区分不同进制的数字常量,而后缀则用于区分不同类型的整数和浮点数。正确使用前缀和后缀,可以提高代码的可读性和可维护性,确保编译器正确地理解和处理常量。
41 1
|
3月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
60 1