【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇

  🌈write in front :

🔍个人主页 : @啊森要自信的主页

✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊!

欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 请添加图片描述

文章目录

  • 前言
  • 一、数据类型
    • 1.1字符型
    • 1.2 整型
    • 1.3 浮点型
    • 1.4 布尔类型
  • 二、各种数据类型的⻓度
    • 2.1 sizeof操作符
    • 2.2 数据类型⻓度
    • 2.3 sizeof中表达式不计算
  • 三、signed 和 unsigned
  • 四、数据类型的取值范围
  • 总结


前言

在这里插入图片描述

一、数据类型

C语言主要的数据类型和变量的数据类型有:

  1. 基本数据类型:
  • 整数类型:

    • char:字符类型,占1字节
    • short:短整型,占2字节
    • int:整型,占4字节
    • long:长整型,占4或8字节
    • long long:更长的整型,占8字节
  • 浮点数类型:

    • float:单精度浮点数,占4字节
    • double:双精度浮点数,占8字节
  • 其他类型:

    • void:无类型
    • bool:布尔类型C语言没有内置布尔类型bool,需要包含<stdbool.h>头文件
  1. 变量的数据类型:
  • 自动变量:定义在函数或代码块内的变量,生命周期在函数或代码块结束后结束。
  • 静态变量:使用static声明的变量,生命周期持续整个程序执行期间。
  • 寄存器变量:使用register声明,让变量存储在CPU寄存器中加快访问速度。
  • 外部变量:使用extern声明的变量定义在其他源文件中
  • 指针变量:用于存储地址的值。
  • 数组变量:用于存储多个同类型数据元素。
  • 结构体变量:用于存储不同类型数据元素的集合。
  • 联合体变量:用于存储占用相同内存空间的不同类型数据。
  • 枚举变量:用于定义一组相关常量的值。
#include <stdio.h>
#include <stdbool.h>
int main() 
{// 基本数据类型char ch = 'a'; // 字符类型short num = 10; // 短整型int age = 25; // 整型 long long bigNum = 1000000000; // 长长整型// 浮点数类型float price = 19.99; // 单精度浮点 double weight = 75.123; // 双精度浮点// 其他类型void func(); // 无类型bool isMale = true; // 布尔类型// 变量的数据类型static int count = 0; // 静态变量register int loop = 0; // 寄存器变量int* pNum = &age; // 指针变量int arr[10]; // 数组变量struct Student {char name[20];int id;} stu; // 结构体变量union Data {int x;char c;} data; // 联合体变量enum Color { RED, GREEN, BLUE }; // 枚举变量printf("char: %c, short: %d, int: %d\n", ch, num, age);return 0;
}

1.1字符型

  char[signed] charunsigned char

1.2 整型

//短整型short [int][signed] short [int]unsigned short [int]//整型int[signed] intunsigned int//⻓整型
long [int][signed] long [int]unsigned long [int]//更⻓的整型//C99中引⼊long long [int][signed] long long [int]unsigned long long [int]

1.3 浮点型

 floatdoublelong double

1.4 布尔类型

C语⾔其实原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数0
表示假,非零表示真。在C99中也引⼊了布尔类型,是专⻔表⽰真假的。
布尔类型的使⽤得包含头⽂件 <stdbool.h>
布尔类型变量的取值是:true或者false.

 #define bool  _Bool#define false 0#define true  1

用代码展示

 _Bool flag = true;if (flag)printf("i like C\n");

二、各种数据类型的⻓度

2.1 sizeof操作符

C语言中的sizeof操作符用来计算数据类型或表达式所占用的内存字节数。

sizeof主要有以下几种用法:

  1. 计算数据类型大小
sizeof(类型名)

例如:

sizeof(int) // 4 
sizeof(char) // 1
  1. 计算数组元素个数
sizeof(数组名) / sizeof(数组元素类型)

例如:

在这里插入图片描述

  1. 计算结构体大小
sizeof(结构体名)

例如:

在这里插入图片描述

  1. 计算表达式大小
sizeof(表达式)

例如:

在这里插入图片描述

C语言标准只规定sizeof运算符返回一个无符号整数,但并没有明确指定返回值的具体类型

这就可能导致程序的可移植性问题:

  • 不同系统下,sizeof返回值类型可能不同,使用不当类型的格式化输出可能会出错,返回值的类型有可能是unsigned int ,也有可能是 unsigned long ,甚⾄是 unsigned long long ,对应的 printf() 占位符分别是 %u%lu%llu

  • 需要存储sizeof结果的变量也需要使用正确的类型,否则可能会溢出或截断。

C语言提供了size_t类型来解决这个问题:

  • size_t是一个类型别名,它会被定义为当前系统下sizeof返回值的正确类型,可能是unsigned intunsigned long等。

  • 程序使用size_t来存储和操作sizeof结果,就可以保证类型安全且可移植。

  • 格式化输出时使用%zd,它会自动匹配size_t类型

#include <stdio.h>
int main()
{int a = 10;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()printf("%zd\n", sizeof(int));printf("%zd\n", sizeof(6 + 8.8));return 0;
}

2.2 数据类型⻓度

您总结得很好,我重新梳理一下C语言主要数据类型的长度:

  • char: 1字节
  • short: 2字节
  • int: 32/64位系统通常为4字节
  • long: 4字节
  • long long: 8字节
  • float: 4字节
  • double: 8字节
  • void*: 与系统地址长度相同,32位系统为4字节,64位系统为8字节
  • size_t: 与系统地址长度相同,用来表示sizeof()函数返回值的类型

X86配置下的输出:
在这里插入图片描述

X64配置下的输出:
在这里插入图片描述

2.3 sizeof中表达式不计算

sizeof运算符计算的不是表达式的值,而是类型的大小。

更准确地说,sizeof运算符返回它操作数类型的大小,单位为字节。
如果操作数是一个类型,那么它直接返回该类型的大小;
如果操作数是一个表达式,那么它返回表达式类型的大小。

举个例子:

int main()
{int a = 10;int b = 20;short s = 2;int c = 30;printf(" %zd\n", sizeof(int)); // 返回int类型大小,如4字节printf(" %zd\n", sizeof(a)); // 返回int类型大小,如4字节,和sizeof(int)相同  printf(" %zd\n", sizeof(a + b)); // 返回int类型大小,如4字节,计算a + b的类型是intprintf(" %zd\n", sizeof(s = c + 1));printf("s = %d\n", s);return 0;
}

在这里插入图片描述

在sizeof(a + b)中:

  • a + b是一个表达式,计算结果是int类型

  • sizeof不计算a + b的实际值,而是直接返回其类型int的大小

  • sizeof(s = c + 1)

    • s = c + 1是一个赋值表达式,计算c+1的值,结果是int类型
    • 但赋值的对象是short类型变量s
    • 所以sizeof返回short类型的大小,即2字节
  • sizeof返回类型大小,不计算表达式值

  • 表达式计算和赋值可能涉及类型转换

sizeof 在代码进⾏编译的时候,就根据表达式的类型确定了,类型的常⽤,⽽表达式的执⾏却要在程序运⾏期间才能执⾏,在编译期间已经将sizeof处理掉了,所以在运⾏期间就不会执⾏表达式了。

三、signed 和 unsigned

signed和unsigned关键字用于指定整数类型的符号:

  • signed: 有符号整数类型,可以表示正数和负数。默认情况下所有整数类型(char、short、int、long)都是signed的。

  • unsigned: 无符号整数类型,只能表示非负整数,范围比signed类型更大。

主要区别:

  1. 存储表示:

    • signed类型用二进制最高位表示数值的符号,正数为0,负数为1

    • unsigned类型最高位都是数值本身,不表示符号。

  2. 数值范围:

    • signed类型的范围依赖于其位宽,如int为-2147483648到2147483647。

    • unsigned类型没有符号位,所以范围比signed类型更大,如uint为0到4294967295。

  3. 运算结果:

    • signed类型在一些运算中可能会发生溢出。

    • unsigned类型不会发生溢出,超出范围直接循环回到最小值。

小例子:

#include <stdio.h>int main()
{unsigned int a = 10;signed int b = 10;a -= 20;b -= 20;printf("a = %zu\n", a);printf("b = %zd\n", b);return 0;
}

在这里插入图片描述

第一种分析:

  • a为unsigned int,范围0-4294967295
  • a原值为10,减20后为-10
  • 但unsigned int没有负数表示,所以-10会溢出计算为最大值4294967295
  • b为signed int,范围-2147483648-2147483647
  • b原值为10,减20后为-10
  • -10正好在signed int范围内,所以结果正确输出为-10
  • 这里unsigned intsigned int在减法溢出后的表现不同:
  • unsigned int溢出后取最大正值
  • signed int保留数值的符号,输出负数

所以这个例子更清晰地展示了signed和unsigned类型在溢出情况下的区别。

二进制重新解释这道题:

题目中有两个变量:

  1. unsigned int a,其范围为0-4294967295

  2. signed int b,其范围为-2147483648-2147483647

开始时:

a = 10
b = 10

然后执行:

a -= 20
b -= 20

分析:

  1. 对于a来说,它是unsigned int类型,没有负数表示。
    当a-=20时,正确的二进制计算是:
a原值: 0000 0000 0000 0000 0000 0000 0000 1010 (10)
a-=20:  0000 0000 0000 0000 0000 0000 0000 0110 (-10,unsigned int没有负数)

由于结果-10超出了unsigned int的范围,所以根据无符号溢出规则,高位溢出位被舍弃,结果保留为最大正值:

0000 0000 0000 0000 0000 0000 0000 0110 溢出为4294967295
  1. 对于b来说,它是signed int类型,可以表示负数
    当b-=20时,二进制计算是:
b原值: 0000 0000 0000 0000 0000 0000 0000 1010 (10)  
b-=20: 1111 1111 1111 1111 1111 1111 1111 1010 (-10)

-10处于signed int的有效范围内,所以结果直接输出-10

总之,通过这个例子可以清晰地看出:

  • unsigned int在溢出时结果取最大正值
  • signed int根据符号位判断正负,直接输出结果

四、数据类型的取值范围

C语言主要的数据类型和其取值范围如下:

用二进制来解释C语言主要数据类型的取值范围:
它的高位为符号位:0表示正数,1表示负数。

  1. char
  • 1字节,表示为8位二进制
  • 高位为符号位,0表示正数,1表示负数
  • 所以取值范围是:0xxx xxxx ~ 0111 1111,即0~ 127为正数,-128 ~ -1为负数
  1. unsigned char
  • 也是1字节8位二进制
  • 但没有符号位,所以全为数据位
  • 取值范围是:0000 0000 ~ 1111 1111,即0~255
  1. short
  • 2字节,表示为16位二进制
  • 高位为符号位,0表示正数,1表示负数
  • 所以取值范围是:0xxx xxxx xxxx xxxx ~ 0111 1111 1111 1111,即0~ 32767为正数,-32768~ -1为负数 (这里的"xxx"代表低15位可以是0或者1,也就是数据位。)
  1. unsigned short
  • 也是2字节16位二进制
  • 没有符号位,所以全为数据位
  • 取值范围是:0000 0000 0000 0000 ~ 1111 1111 1111 1111,即0~65535

总结

以上归纳了C语言主要的数据类型分类,获取数据类型长度的方法,signedunsigned的区别,以及各种数据类型在不同情况下的取值范围范围。感谢你的收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个帮助,可以给博主点一个小小的赞😘
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的Sysfs 接口

一、sysfs接口 在linux系统中&#xff0c;用户空间访问驱动程序一般是以“设备文件”的方式通过“read/write/ioctl”访问&#xff0c;还有一种方式&#xff0c;可以通过echo的方式来直接控制硬件或者修改驱动&#xff0c;也能为底层驱动提供一个接口便于应用层调用&#xff0c…

app上架一直显示审核中状态要怎么处理?

当你提交一个应用到App Store上时&#xff0c;它会经历一个审核过程。在这个过程中&#xff0c;苹果的审核人员会检查你的应用是否符合苹果的规定和标准。这个过程通常需要几天的时间&#xff0c;但是如果你的应用一直显示“审核中”状态&#xff0c;那么可能会有一些原因。 1…

广州华锐互动:VR虚拟现实内容创作工具带来全新的应用场景

随着科技的不断发展&#xff0c;低代码编辑工具已经成为了一种越来越受欢迎的开发方式。它可以帮助开发人员快速构建应用程序&#xff0c;降低开发成本&#xff0c;提高开发效率&#xff0c;而VR虚拟现实内容创作工具带来了全新的应用场景。 VR虚拟现实内容创作工具是广州华锐互…

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子&#xff0c;其结构复杂多样&#xff0c;蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看&#xff0c;蛋白质的结构可以分为四个层次&#xff1a;初级结构、二级结构、三级结构和四级结构。 初级结…

模拟实现offsetof宏(详解)

我们在以前学过这个offsetof函数&#xff0c;知道它的功能是求指针相较于起始位置的偏移量&#xff0c;我们今天要来写出一个宏&#xff0c;计算结构体中某成员变量相对于起始位置的偏移。 目录 1.offsetof函数 1.1offsetof函数介绍 1.2offsetof函数代码实现 2.offsetof函数…

python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id

1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC 2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式 # 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC&#xff1a;跨语言的 htt…

dart多线程双向通信的案例----【小学4年级课程】

下面是运行后的打印顺序 I/flutter (20170): 上班 I/flutter (20170): 这里是校长室:main I/flutter (20170): 这里是饭堂:fantang1 I/flutter (20170): 这里是收发室--检查小孩发回去给他妈妈的信息是&#xff1a;我是秘书的儿子&#xff0c;我来到在校长室了。校长今晚想吃羊…

【Web】SWPUCTF 2022 新生赛 个人复现

目录 ①webdog1__start ②ez_rce ③ez_sql ④ez_1zpop ⑤file_maste ⑥Power! 挑了部分题&#xff0c;太简单的就没选进来&#xff08;但选进来≠有难度&#xff09; ①webdog1__start 进来没啥东西&#xff0c;右键查看源码 对于0e215962017&#xff0c;md5后也是以…

Salesforce原生ERP产品 vs. 集成:如何选择?

Salesforce允许企业管理所有的客户交互。随着Salesforce平台的日渐成熟&#xff0c;企业已经能够获取成倍的收益。会计解决方案和其他ERP工具尤其契合&#xff0c;客户数据不会碰壁&#xff0c;可以在服务交付和客户成功、发票和账单、收入确认和续订的过程中继续前进。 一些…

群晖NAS配置之自有服务器ngrok实现内网穿透

群晖NAS配置之自有服务器ngrok实现内网穿透 前言-内网穿透 内网穿透是指通过一种技术让外部网络可以访问到内网的NAS设备&#xff0c;这样即使在不同网络环境下&#xff0c;也能够远程访问和管理NAS设备。以下是一些常见的内网穿透方案&#xff1a; Synology官方提供的Quick…

IDEA 配置 gradle6.8.3 解决导入gradle项目下载太慢问题

由于平时用的是springboot 2.7 这里下载gradle-6.8.3 Gradle官网地址&#xff1a;https://services.gradle.org/distributions/ 1.下载gradle后&#xff0c;配置环境变量 GRADLE_HOME {gradle 文件路径} GRADLE_USER_HOME {jar下载路径&#xff0c;可以放maven jar保存路径…

链接2:静态链接、目标文件、符号和符号表

文章目录 静态链接符号解析 (symbolresolution)重定位 (relocation) 目标文件1.可重定位目标文件2.可执行目标文件3.共享目标文件 可重定位目标文件text:rodata:.data.bss.symtab.rel.text.rel.data:debug:line:strtab: 符号和符号表由m定义并能被其他模块引用的全局符号由其他…

基于Pix2Struct的文档信息提取【DocVQA】

文档信息提取涉及使用计算机算法从非结构化或半结构化文档&#xff08;例如报告、电子邮件和网页&#xff09;中提取结构化数据&#xff08;例如员工姓名、地址、职务、电话号码等&#xff09;。 提取的信息可用于各种目的&#xff0c;例如分析和分类。 DocVQA&#xff08;文档…

MySQL基础进阶篇

进阶篇 存储引擎 MySQL体系结构&#xff1a; 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 相关操作&#xff1a; -- 查询建表语句 show create …

BGP综合实验(IP)

实验要求&#xff1a; 实验思路&#xff1a; 1.划分IP地址&#xff1a; 将172.16.0.0/16的网段划分为172.16.0.0/24的多个网段&#xff0c;因为在实际工程当中&#xff0c;24的网段更符合用户网段&#xff0c;因此先将网段划分为172.16.0.0 /24的多个子网掩码为24的网段&…

filebeat(远程收集日志工具)

&#xff08;一&#xff09;filebeat 1、filebeat和logstash相同 &#xff08;1&#xff09;filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 &#xff08;2&#xff09;filebeat可以运行在非Java环境、可以代理l…

C语言——计算Fibonacci数列

方式一 for循环 (20位) #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int a[20]{1,1};for ( n 1; n <20; n){a[n]a[n-2]a[n-1];}for ( n 0; n < 20; n){if(n%50)printf("\n");printf("%12d ",a[n]);}return 0; …

【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核任务中断)、与硬件的关系实现

文章目录 一、为什么要学习μC/OS-III二、嵌入式操作系统的发展历史三、实时操作系统的特点四、基本概念1. 前后台系统2. 操作系统3. 实时操作系统&#xff08;RTOS&#xff09;4. 内核5. 任务6. 任务优先级7. 任务切换8. 调度9. 非抢占式&#xff08;合作式&#xff09;内核10…

轻量级web开发框架:Flask本地部署及实现公网访问界面

轻量级web开发框架&#xff1a;Flask本地部署及实现公网访问界面 文章目录 轻量级web开发框架&#xff1a;Flask本地部署及实现公网访问界面前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何…

CI/CD 构建中能保护好 SSHKEY吗?

目录 背景 方案 编码存储 逐行存储 合并存储 打马赛克 结论 背景 使用极狐GitLab CI/CD&#xff0c;在部署方面&#xff0c;主要有两种方式&#xff1a; 部署到K8S集群 Push模式&#xff1a;流水线通过kubectl执行命令部署&#xff0c;这需要把K8S的权限给流水线&#xf…