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;
}

相关文章
|
2月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
43 1
|
2月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
2月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
2月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
36 3
|
16天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
2月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
42 10
|
1月前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。