3.C基础_数据类型

数据类型概述

在计算机的内存中存放了很多的二进制数据,数据类型就是管理这些数据的含义。比如下面的内存数据,尽管内存中的数据是完全一样的,但数据类型不同,实际代表的数值含义也不同。

sizeof关键字

sizeof可以获取数据所占的空间的字节数,返回值为长整型long,单位为字节。

使用方法:

  • sizeof(变量、数据类型关键字)
  • sizeof 变量

各种数据类型

1、整型

整型数据有五种:char、short、int、long、long long 以及这五种对应的unsigned形式。

下面是整型的总汇表:

|-----------------------------|---------|-----------|-----|-----------------|
| 数据类型 | 名称 | 所占空间 (字节) | 占位符 | 取值范围 |
| char(signed char) | 有符号字符 | 1 | %d | -2^7-1~2^7 |
| unsigned char | 无符号字符 | 1 | %c | 0~2^8-1 |
| short(signed short) | 有符号短整型 | 2 | %d | -2^15-1~2^15 |
| unsigned short | 无符号短整型 | 2 | %u | 0~2^16-1 |
| int(signed int) | 有符号整型 | 4 | %d | -2^31-1~2^31 |
| unsigned int | 无符号整型 | 4 | %u | 0~2^32-1 |
| long(signed long) | 有符号长整型 | 4、8 | %ld | ... |
| unsigned long | 无符号长整型 | 4、8 | %lu | ... |
| long long(signed long long) | 有符号长长整型 | 8 | %ld | -2^63-1~2^63 |
| unsigned long long | 无符号长长整型 | 8 | %lu | 0~2^64-1 |

long型的大小与计算机系统的位数有关。32位系统对应的是4字节、64位系统对应的是8字节

2、字符型

字符型数据也是一种整型,它对应的类型为unsigned char。0~255中的每一个数字对应一个字符,这个字符的规定可以在ASCII码表中查询得到。

在Linux中,可以使用" man ASCII "来查询ASCII码表:

ASCII码表的字符分类:

  • 通讯、控制类字符:00H~1FH,共32个,有些无法显示在屏幕上
  • 符号、数字、字母:20H~7FH,共96个,全部都可以显示在屏幕上
  • IBM制定的扩充字符:80H~FFH,共128个,这些是非标准的ASCII码

定义相关特点:

字符型实质是整型,对应的是ASCII码。因此下面的定义效果实际上是一样的:

cpp 复制代码
char val = 'A'; //以字符赋值变量
char val = 65;  //以字符对应的ASCII码赋值变量

常用字符的ASCII码:

  • a~z:97~122
  • A~Z:65~90
  • 0~9:48~57
  • 空格:32
  • 换行符\n:10

常用字符转换方法:

  • 大写字母与小写字母转换:±32(97-65 = 32)
  • 整型数字与字符数字转换:±48(0的ASCII码为48)

3、浮点型(实型)

浮点型数据有三种:float、double、long double

下面是浮点型的总汇表:

|-------------|-----|------------|-----|------------|
| 数据类型 | 名称 | 所占空间 (字节) | 占位符 | 精度(小数点后几位) |
| float | 单精度 | 4 | %f | 6 |
| double | 双精度 | 8 | %lf | 15~16 |
| long double | 长精度 | >=8与编译器有关 | %Lf | >=15~16 |

3.1 浮点型的表示

浮点型可以用小数来表示,也可以使用科学计数法表示,具体定义如下:

cpp 复制代码
float val = 0.08;//正常的小数表示
float val = 8e-2;//科学计数法 8*10^-2

3.2 浮点型的内存形式

浮点型的内存存放形式遵循IEEE 754标准,具体标准如下:

对于E,这个称为偏移的阶码、移码。float的偏移量为127,double的偏移量为1023

下面以9.625为例,手算float类型的内存形式,具体计算过程如下:

下面是辅助计算的网址及操作方法:

Base Convert: IEEE 754 Floating Point

3.3 浮点型的比较判断注意点

如果浮点型的小数部分的处理是循环的(就是第一步进制转换时,小数部分*2取整步骤一直乘不尽),那么float与double类型的值是不一致的,这个原因是因为在内存中的M部分保存的数值不一样,精度缺失也不一样。下面以2.2和2.25为例:

在代码中的体现如下:

  • float与double变量比较
  • float与常数比较(常数默认为double型,加上 f 变为float型)

因此浮点数的比较不能直接使用 == 进行比较,而是使用求差的方式进行比较,具体代码如下:

4、布尔型

布尔变量是一个逻辑值,下面是布尔变量的表:

|-------|----|----------|-----|------|
| 数据类型 | 名称 | 所占空间(字节) | 占位符 | 取值范围 |
| _Bool | 布尔 | 1 | %d | 0、1 |

  • 布尔类型只有0、1,非0数赋值给布尔变量会变为1,0赋值给布尔变量还是0。
  • 所占空间为1字节,用第0位来表示0、1,其余7位不使用。

在 " stdbool.h "中,定义了布尔类型的一些宏,具体如下:

cpp 复制代码
#define bool _Bool /* _Bool是关键字,bool只是别名不是关键字 */
#define true 1
#define false 

下面用一个例子来验证布尔的运算,代码和运行结果如下:

5、缺省型void

void是缺省型,代表没有类型。通常用法如下:

  • 用于函数前,代表没有返回值
  • 用于指针类型void*,代表通用指针类型,可以指向任何类型的数据

数据类型转换

数据类型的转换有自动类型转换和强制类型转换,自动类型转换还包括赋值操作时的转换、二元运算时的转换,数据类型的转换框图如下:

1、自动类型转换

1.1 赋值操作

在赋值操作时,等号右边的变量类型会自动转变成等号左边的变量类型,当右边类型精度比左边类型精度大时,会产生损失精度的问题。

cpp 复制代码
/* 赋值时,数据类型转换 */
int a;
a = 3.14;//a为int,3.14为double,赋值时3.14会转成int变成3,产生了精度损失 

1.2 二元运算

二元运算就是有两个参数的运算,如加、减、乘、除等。

二元运算时自动会向精度高的类型转换,转换路径如下:

简单的验证代码如下:

cpp 复制代码
/* 二元运算时的数据类型转换 */
int a = 50;
double b = a*0.3;/* a为int,0.3为double. a会先转为double再与0.3相乘 */

2、强制类型转换

强制类型转换就是在变量前写上" (变量类型) ",即可将该变量的类型进行转换。

例如在除法中,需要保留精度,具体代码如下:

cpp 复制代码
/* 未强制转换 */
int a = 100;
int b = 3;
printf("%.2lf",a/b);
//a,b都为int,运算之后为33.333舍弃小数部分,即33,精度损失

/* 进行强制转换 */
int a = 100;
int b = 3;
printf("%.2lf",(double)a/b);
//a被强转为double,运算时b会自动转为double,最终结果为double型33.33,精度不丢失
相关推荐
小胖伦的夕阳粉14 分钟前
js 获取树节点上某节点的最底层叶子节点数据
开发语言·javascript·ecmascript
不见长安见晨雾23 分钟前
将Java程序打包成EXE程序
java·开发语言
可愛小吉26 分钟前
Python 课程14-TensorFlow
开发语言·人工智能·python·tensorflow
编程零零七27 分钟前
Python数据分析工具(四):pymysql的用法
开发语言·python·oracle·数据挖掘·数据分析·python项目·python源码
别耗尽29 分钟前
错题集锦之C语言
c语言
六点半88829 分钟前
【C/C++】速通涉及string类的经典编程题
c语言·开发语言·c++·算法
汤姆和杰瑞在瑞士吃糯米粑粑31 分钟前
string类(C++)
开发语言·c++
逸狼1 小时前
【JavaEE初阶】多线程(5 单例模式 \ 阻塞队列)
java·开发语言
Jack黄从零学c++1 小时前
自制网络连接工具(支持tcpudp,客户端服务端)
linux·c语言·开发语言·网络协议·tcp/ip·udp·信息与通信
day3ZY1 小时前
清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
c语言·开发语言·缓存