数据类型和数据存取
本节我们将要学习c语言的数据类型和计算机是如何进行数据存取的
前言
在每种编程语言和数据库中,都有自己特定的数据类型,这些数据类型定义了程序中可以使用的各种不同类型的数据,并为程序员提供了操作这些数据的方法和手段。因此,掌握数据类型是计算机编程的重要基础之一。除了了解数据类型外我们还要学习计算机对数据的存取是怎样的,这样能使我们在开发过程中对内存状况做到心中有数,从而能偶应对复杂的开发环境。
数据类型
数据类型是计算机编程中的一个重要概念,它定义了变量或数据在内存中所占用的空间大小和布局方式,以及该数据可以进行的操作。数据类型是计算机对数据进行分类的一种标准,它使得程序能够更好地理解和处理各种不同类型的数据。在c语言中的数据类型又可以分为四大类:
- 基本数据类型
- 构造类型
- 指针类型
- 空类型
变量与常量
在了解具体的数据类型前,我们先学习变量与常量
常量
常量就是立即数,所见即所得,存在文字常量区它的值不能被修改。
变量
变量用于存储和引用可变数据值的标识符,它们可以在程序执行期间被赋予和修改不同的值。变量在定义是必须有类型,内存会为变量开辟空间。
变量的定义形式: 数据类型 变量名 ;
需要注意的是变量的命名可由数值、字母、下划线组成但是不能以数值开头,也不能是关键字。
基本数据类型
c语言中的数据类型很多我们主要学习基本数据类型,基本数据类型的详细分类如下图
字符型
-
字符常量比如:‘a’ ‘1’ ‘,’
单引号的作用是字符,单引号只能作用一个字符,转义符除外。
计算机只能存放数值,为了能够存放字符需要用一个数值对应唯一的字符,而这个数值代表该字符的ASCII值。
单引号的作用是字符,单引号只能作用一个字符,转义符除外。计算机只能存放数值,为了能够存放字符需要用一个数值对应唯一的字符,而这个数值代表该字符的ASCII值。
-
字符变量
声明字符变量的是的关键字是char,用于存放字符占1个字节例如:
char ch = 'c';
单引号的一个功能是描述字符,第二个功能是取字符的ASCII码 值。
整型
-
整型常量
例如: 10 20 123
-
整型变量
声明整型变量的关键字是int,占4个字节,一个字节(Byte)=8位(bit),所以int型变量是32位的。
int num = 10;
短整型 short,占2个字节。
长整型 long,占4个字节。
实型
-
实型常量
以f结尾的实型为float类型,不以f结尾的实型为double类型。
指数形式:123e3 代表123* 10的三次方,123e-3代表123 *10的负三次方。
-
实型变量
单精度和双精度两者的都可以用来存放小数,区别在于双精度浮点型可以精确的小数位比单精度浮点型的多。float占4个字节,double占8个字节。
枚举类型
枚举类型enum是计算机编程中的一种数据类型,它由用户定义,包含一组具有特定意义的名称(枚举常量)的集合。
其他数据类型
除了上文中介绍的基本数据类型外还有其他数据类型,这里做简单介绍,有需要深入了解的的可自行查阅。
构造类型
构造类型(Constructed Types)是一种重要的数据类型,它允许程序员通过组合已有的数据类型来创建新的数据类型。这些已有的数据类型可以是基本数据类型(如整数、浮点数、字符等),也可以是其他构造类型。构造类型提供了更丰富的数据表示方式,以满足复杂的数据结构需求。常见的构造体类型有数组、结构体、联合。
指针类型
指针类型(Pointer Types)是一种非常重要的数据类型,它用于存储内存地址。指针变量可以指向其他变量的内存地址,通过指针可以间接访问和操作这些变量。指针在编程中扮演着重要的角色,尤其在处理复杂数据结构和算法时。之后的文章中我们会详细学习有关指针的知识。指针类型是编程语言中一种强大而灵活的工具,它允许程序员直接操作内存中的数据。然而,由于指针的复杂性和潜在的风险,使用指针时需要格外小心。
空类型
空类型(Void Type)是编程语言中的一种特殊数据类型,用于表示无类型或空值。常见于函数的返回值类型。
void function ()
{
return ;
}
数据存取
了解计算机的数据存取过程对于性能优化、资源管理、错误诊断与修复、安全性、设计与决策都大有裨益,对于计算机科学家、软件工程师、系统管理员来说是非常重要的。
进制转换
进制的概述
二进制:范围0~1以0b开头 比如:0b00001010C语言不能直接输出二进制。
八进制:范围0~7以0开头比如:0123输出格式:%0。
十进制:范围0~9 开头没限定 比如:100输出格式:%d%hd %ld %u %hu %lu
十六进制:范围0~9 a~f 以0x比如:0x123 输出格式:%x
进制之间的转换
-
十进制转二进制、八进制、十六进制都可以使用短除法。
以将十进制123转换为二进制为0b0111 1011
- 二进制、八进制、十六进制转换为十进制(位次幂)
将:1100 0011转成成十进制:195
将:0156 转十进制:110
将:0xabc转十进制:2748
-
二进制转八进制
从右往左,每3位二进制数对应1位八进制数。记得八进制数据以0开头。
11 000 101 —> 0305
1010 0110 —>0246
-
八进制转二进制
每1位八进制对应3位二进制
0475 —>1 0011 1101
-
二进制转十六进制
从右往左每4位对应1位十六进制
0101 0110 —>0xbd
-
十六进制转二进制
每1位十六进制对应4位二进制
0xabc —> 1010 1011 1100
-
八进制转十六进制
八进制先转为二进制再转为十六进制
-
十六进制转八进制
十六进制先转为二级制再转为八进制
原码 反码 补码
概述
原码、反码和补码是计算机中表示算术运算的三种不同的方法。无符号数和有符号正数以原码存储,有符号负数以补码存储。
10 原码:1000 1010
反码:符号位不变,其他位按位取反
补码:反码+1
补码的意义
统一0的编码
-0 源码:1000 0000 反码:1111 1111 补码:0000 0000
+0 源码:0000 0000 反码:0000 0000 补码:0000 0000
将减法变加法运算,使得计算机只需要一套电路就能完成加减法运算。
计算机数据存取
取
void test()
{
//无符号变量存无符号数据 以原码存储
unsigned int data = 100;
//0000 0000 0000 0000 0000 0000 0110 0100
printf("%#x\n",data);
//0000 0000 0000 0000 0000 0000 0110 0100
//0x64
//无符号变量存负数 先将负数转化为补码再存储
data = -100;
//1000 0000 0000 0000 0000 0000 0110 0100
printf("%#x\n",data);
//1111 1111 1111 1111 1111 1111 1001 1100
//0xffffff9c
//有符号变量存储正数 以原码存储
int num = 100;
//0000 0000 0000 0000 0000 0000 0110 0100
printf("%#x\n",num);
//0x64
//有符号变量存储负数 以补码存储
num = -100;
//原: 1000 0000 0000 0000 0000 0000 0110 0100
//补: 1111 1111 1111 1111 1111 1111 1001 1100
printf("%#x\n",num);
//0xffffff9c
//八进制和十六进制都是原码存储 他们没有负数
}
-
总结
无符号变量存储无符号数据,有符号变量存储正数,以原码存储。
有符号变量和无符号变量存储负数,以补码存储。
八进制和十六进制以原码存储。
存
void test()
{
//无符号取:%u %hu %lu
//有符号取:%d %hd %ld
//无符号变量 无符号取 内存数据 原样输出
unsigned int data = 0x64;
//0000 0000 0000 00000000 0000 0110 0100
printf("%u\n",data);
//100 == 0000 0000 0000 0000 0000 0000 0110 0100
printf("%d\n",data);
//100 == 0000 0000 0000 0000 0000 0000 0110 0100
//无符号变量 有符号取 看内存最高位 0则原样输出 1求补码输出
/*************************************/
//有符号变量 无符号取 内存数据 原样输出
int num = 0x64;
//0000 0000 0000 0000 0000 0000 0110 0100
printf("%u\n",num);
//0000 0000 0000 0000 0000 0000 0110 0100
printf("%d\n",num);
//0000 0000 0000 0000 0000 0000 0110 0100
num = 0x80000053;
//1000 0000 0000 0000 0000 0000 0101 0011
printf("%u\n",num);
//1000 0000 0000 0000 0000 0000 0101 0011
printf("%d\n",num);
//1111 1111 1111 1111 1111 1111 1010 1101
// %0 八进制输出 &x十六进制输出 内存数据原样输出(没有负数)
}
-
总结
无符号取 内存原样输出。
有符号取 看内存最高位 0原样输出 1补码输出。
结语
数据类型是编程的基础,它们决定了变量如何存储和操作数据。而计算机数据存取则是程序与硬件之间的桥梁,让我们能够将数据存储在内存中,并从内存中读取数据。鉴于本人的水平有限,所以此处至分享了一小部分。我希望通过这篇博客,能够激发你们对这个领域的兴趣,同大家一起走向更深入的学习和研究。
点击查看往期内容