C语言中的数据类型有哪些?

在这里插入图片描述

  • 有符号数signed可以存储负数,无符号数只能存储非负数

在选择有符号整型或无符号整型前,我们要考虑两个问题。

  • 第一个问题是将要存储的整数,它是一个多大的范围,比如说要存储一个5。还有比如说我可能要算个数65535,或者说我要算出一个数65536,可能数据本身比较小,也可能会比较大。在存储时,可能会担心我们用的数据很大,我们所选择的数据类型是否存得下,这是一个要考虑的问题。
  • 另外一个问题,存储数据时,数据可能是个负数,比如存一个-5。也可能要存一个+5,当数据要存储正数或负数形式时,也应该考虑使用的类型能不能存储有符号整数
  • 所以我们选择整数类型的数据时需要基于这两个原则,一个是范围,另一个是数据的正负角度。

基本数据类型

逻辑类型。只有两个元素true和false,表示逻辑真值和逻辑假值。

整数类型。包括char, short, int和long。

浮点类型。包括float和double。

void类型。主要用于说明不返回值的函数或指向任一类型的指针等。

bool类型 需要引入<stdbool.h>头文件 _Bool基本类型
在这里插入图片描述

布尔实际上也是通过整型实现的

例如,

if ( -1 )
	x=12 ;
else
	x=18 ;

上面-1是非零数值,逻辑值为真,所以x赋给的是12,而不是18。
在<stdbool.h>头文件中, true就是1, false就是0;bool是一个宏。没有加头文件时报错,是因为这些宏是在这个头文件加的,所以需要引入这个头文件,当我们的代码中需要涉及到true和false就需要引入头文件,因为true和false的宏是在<stdbool.h>头文件中定义的。

  • char类型
    在这里插入图片描述

在 C 语言中,字符和整数之间的关联是非常强的,字符常量事实上是 int 类型而不是 char 类型(这 是一个非常有趣的现象,但对我们并无影响)。当计算中出现字符时,C 语言只是使用它对应的整数值。

10000000 是一个8位二进制补码数,首位是1,因此它是一个负数的补码表示。
在二进制补码中,我们需要将每一位乘以对应的权重,并将所有位的结果相加,得到十进制的表示。

1 * (-2^7) = -128
0 * 2^6 = 0
0 * 2^5 = 0
0 * 2^4 = 0
0 * 2^3 = 0
0 * 2^2 = 0
0 * 2^1 = 0
0 * 2^0 = 0

将所有位的结果相加:

-128 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = -128
所以,10000000 对应的十进制数是 -128。

使用char数据类型的变量需要特别注意,防止数据超出值域,思考下列几个语句:

  • 在 64 位操作系统中,long 数据类型通常占 8 字节(64 位),也就是 64 位二进制数。
  • 在 32 位操作系统中,long 数据类型通常占 4 字节(32 位),也就是 32 位二进制数。
 char   c1= 128;       //出错,数据越界(-128)
 char   c1= 129;       //出错,数据越界(-127)
 unsigned char  c2= -1;  //出错,数据越界(255)
  • 在计算机中,字符型数据是用来表示字符的数据类型,不直接表示整数,但在内部存储时,字符型数据实际上被表示为整数。
  • 计算机使用编码表,如ASCII(美国标准信息交换码)或Unicode,将字符映射为相应的整数值。在ASCII编码中,每个字符都与一个唯一的整数值(0到127)相关联,表示为一个8位的二进制数。
  • 当在计算机中处理字符型数据时,实际上是在处理对应的整数值。对于有无符号的整数字符型数据,计算机并不直接知道该字符是有符号还是无符号,它只知道对应的整数值。在计算机内部,字符型数据的整数值不区分有符号和无符号,都以二进制形式存储。
  • 当我们从程序中获取字符型数据并进行处理时,我们需要根据编码规则(如ASCII)将整数值解释为字符或相应的含义。对于字符型数据,通常由程序员来处理,根据具体的需求来解释字符的含义,并决定是否按照有符号或无符号来处理整数值。在C语言等编程语言中,我们可以通过声明字符型数据为char类型来处理字符型数据。根据C语言的规范,char类型既可以被视为有符号也可以被视为无符号,这取决于编译器的实现和计算机的体系结构。

总结来说,计算机内部对字符型数据实际上是以整数形式表示的,但是否有符号取决于具体的数据解释和计算机的体系结构。程序员在处理字符型数据时需要注意如何解释整数值,以确保正确地处理字符和相应的含义。

在实际使用中,为了避免混淆,最好在代码中明确指定char类型的有无符号性,或者使用更明确的整数类型(如int、unsigned、char等),以确保正确地处理字符型数据。

short类型<limits.h>

  • 在这里插入图片描述

int类型

  • 在这里插入图片描述

long类型在这里插入图片描述

4G的空间为4294967296字节, 跟long类型可取值的数目相同。

浮点类型

  • 在这里插入图片描述

Tips:特别大的数或特别小的数简易用浮点型的指数形势。

强制数据类型转换

  • 强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显式的数据类型转换,和隐式的数据类型转换。

  • 例如,

    • int a=22, b=0 ;

    • float c = 24.87, d= 3.3;

    • b = (int) (a + c +d) ; // b为50

  • 强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来

  • 强制类型转换符是一种不安全的转换,一般都是将高级类型转换成低级类型,要丢失数据的精度;

  • 强制类型转换并不改变表达式中变量的数据类型和其值。

总结与思考

主要介绍了数据类型,包括分类、基本类型介绍、强制类型转换。

思考:

  • C语言中包括哪些数据类型?

答:整型、字符型、实型、枚举型、数组、结构体、共用体、指针类型、空类型

  • 如何做强制类型转换?
  • 答:在C语言中,可以使用强制类型转换符(类型名)来进行强制类型转换。强制类型转换的基本格式如下:
(目标数据类型) 表达式

其中,目标数据类型是希望将表达式转换成的数据类型,表达式是需要转换的数据。需要注意以下几点:

  1. 强制类型转换符是一对小括号,将目标数据类型放在括号内。

  2. 强制类型转换符后面的表达式如果存在复杂运算,应该用小括号括起来,以确保转换的顺序正确。

  3. 强制类型转换通常用于将高级类型转换成低级类型,可能会丢失数据的精度。因此,在进行强制类型转换时,应该谨慎考虑是否会导致数据精度丢失。

  4. 强制类型转换并不改变表达式中变量的数据类型和其值,只是在使用该表达式时按照目标数据类型进行解释。

以下是几个示例:

int a = 22, b = 0;
float c = 24.87, d = 3.3;
b = (int)(a + c + d); // b为50,将浮点数和整数相加后强制转换为整数类型

float pi = 3.14159;
int approximatePi = (int)pi; // approximatePi为3,将浮点数pi强制转换为整数类型

在进行强制类型转换时,需要根据实际情况仔细考虑数据类型的选择,以确保程序运行正确并得到预期的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevGeek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值