【c语言学习】数据类型和数据存取

数据类型和数据存取

本节我们将要学习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补码输出。

结语

数据类型是编程的基础,它们决定了变量如何存储和操作数据。而计算机数据存取则是程序与硬件之间的桥梁,让我们能够将数据存储在内存中,并从内存中读取数据。鉴于本人的水平有限,所以此处至分享了一小部分。我希望通过这篇博客,能够激发你们对这个领域的兴趣,同大家一起走向更深入的学习和研究。
点击查看往期内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值