学好C语言从关键字开始

article/2025/10/23 12:10:31

目录

1、C语言数据类型

2、变量的命名规则 

3、最冤枉的关键字——sizeof

4、signed和unsigned 

原、反、补 

深入理解变量内容的存入和取出

大小端


1、C语言数据类型

在学习C语言数据类型之前,我们得先了解:为什么要有类型?  类型为什么有这么多种类?

①为什么要有类型?

答:类型本质是对内存进行合理化划分,按需索取

② 类型为什么有这么多种类?

答:应用场景不同,解决应用场景对应的计算方式不同,需要空间的大小也不同。 (本质:用最小成本,解决各种多样化的场景问题)

了解这两个问题之后我们也就知道了  变量定义:是什么?为什么?怎么办?

  • 变量定义是:在内存中开辟一块空间(注:按需索取)
  • 为什么要定义变量:因为我们要解决各种多样化的场景问题
  • 定义变量后怎么办:就可以使用了 (定义变量时要初始化)

定义变量格式:类型  变量名 = 初始化;

(定义变量时 :类型决定了变量需要开辟多大内存空间

辅助理解: 数据类型跟制作月饼模具很类似

 如果我们要制作一个小月饼,我们肯定会运用小模具去制作,不会去用大模具去应用,原因是因为小模具可以制作不会造成空间浪费大模具会造成空间浪费

数据类型也是如此 如果我们要存储一个字符我们会选择运用  char  类型去存储,不会想着用 int 类型,因为一个字符只占一个字节,刚好 char 类型也只开辟一个字节,而 int 类型开辟4个字节就会造成空间浪费 

 那我们接来下我们学习一下C语言中常见的内置内类的大小:

 为什么 long 跟 int 占用的空间一样大?

  • 因为C++标准只规定 long >=  int

2.变量的命名规则 

  1.  由字母数字下划线组成,但不能由数字开头。例如:max 、_max 
  2. 见名知意。例如:max (一看就知道代表的最大值)、min(一看就知道代表的最小值)
  3. 命名应当简洁,不易过长。例如:MaxVal 就比 MaxValueUntilOverflow
  4. 当标识符为多个词组成时,每个单词的第一个字母大写,其余的小写(大驼峰命名)。例如:int CurrentVal
  5. 程序中不易出现只靠大小写区分的相似的标识符。例如:int  x = 0 、int X = 0 。注意:1(数字1)和 l (小写字母L), 0 (数字0) 和 o (小写字母O)的区分
  6. 函数名不易与变量名同名
  7. 所以的宏定义枚举常量只读变量都用大写字母命名下划线分割单词。例如:#define INT_MAX  100 、const  int  MAX_LENGTH = 100
  8. 尽量用 n 、i 、j 作为循环变量的使用
  9. 定义变量的同时记得初始化,定义变量时编译器不一定清空了这块内存,它的值可能是无效值

 3.最冤枉的关键字——sizeof

为什么说它是最冤枉的关键字?

sizeof是关键字不是函数,但是还是会有人认为它是函数。因为我们大部分使用它的时候后面会跟括号 例如:sizeof(int),函数的使用方法也是这样。

那下面我们一起来为这个关键字洗清冤屈吧,证明它不是函数吧!

我们用编译器来证明它是关键字不是函数:

从哪看出来它不是函数而是关键字的了?为什么第三个 printf ( ) 会报错了?

  • 我们可以从第四个printf( )看出 sizeof 不是函数,因为函数名后要加括号,而 sizeof 后没有加括号也没有报错函数调用是会压栈的,sizeof 不会压栈,也说明 sizeof 不是函数
  • 一个关键字不能直接去求另一个关键字的大小,所以第三 printf ( )  会报错。

 将第三个printf( )屏蔽后,程序也就可以正常运行了。

注:sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型大小时不能省略。

 

4、signed和unsigned 

  • signed:有符号
  • unsigned:无符号

原、反、补 

 一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的

那么整型数据在所开辟的内存中是如何存储的了? 

①有符号数

	int a = 10;int b = -10;

有符号数可以分为正数和负数

计算机内存储的整型必须是补码,由此我们便引出了原、反、补码的概念

  • 原码:将一个数直接转换成二进制
  • 反码:符号位不变,其他位按位取反
  •  补码:反码+1

正数的原码、反码、补码相同

负数的原码、反码、补码不相同,故负数的原码、反码、补码需要相互转换

任何数据在计算机中,都必须被转化成二进制,这是为什么呢?

答:因为计算机只认识二进制 

计算机内存储的整型为什么必须是补码?

答:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同 时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不 需要额外的硬件电路

原码、反码、补码三种表示方法均有符号位数值位两部分 

  • 符号位为0:表示正数
  • 符号位为1:表示负数

例1:signed int a = 10 

先将字面值转为补码,然后把补码放入变量 a 中 

原码:00000000 00000000 00000000 00001010

因为 10 为正数,故 原码、反码 相同

反码:00000000 00000000 00000000 00001010

补码:00000000 00000000 00000000 00001010

例2:signed int  a = -10

先将字面值转为补码,然后把补码放入变量 a 中 

原码: 10000000 00000000 00000000 00001010

因为 -10 为负数,故 原码、反码 不相同

反码: 11111111  11111111  11111111  11110101

补码: 11111111  11111111  11111111  11110110

注:在vs中基本类型如果不带 signed 和 unsigned,默认都是有符号的,但是在其他编译器里面就不一定了(大部分不带都是表示有符号的)

补码转原码 

方法一:补码 -1 = 反码   反码取反 = 原码

例如:
补码:11111111 11111111 11111111 11101100
反码:11111111 11111111 11111111 11101011
原码:10000000 00000000 00000000 00010100 

方法二:补码符号位不变其他位按位取反,然后+1=原码
 好处:可以使用一条硬件电路,完成转换

例如:
 补码:11111111 11111111 11111111 11101100
            10000000 00000000 00000000 00010011
 原码: 10000000 00000000 00000000 00010100
 

②无符号数

没有符号位,也就说明了 原码 = 反码 = 补码,那我们在取一个无符号整型变量时 也就可以直接取

例如:unsigned  int  a = -10

原码: 10000000 00000000 00000000 00001010

反码: 11111111  11111111  11111111  11110101

补码: 11111111  11111111  11111111  11110110

 把 -10 的补码存入 无符号整型 a 中,在读取 a 变量里面的值时默认它是无符号的 直接将它里面存的数值转换为十进制打印。

 

深入理解变量内容的存入和取出

  • 存:字面数据必须先转成补码,在放入空间当中。所以,所谓符号位,完全看数据本身是否携带+-号。和变量是否有符号 无关!
  • 取:取数据一定要先看变量本身类型,然后才决定要不要看最高符号位。如果不需要,直接二进制转成十进制。如果需 要,则需要转成原码,然后才能识别。(当然,最高符号位在哪里,又要明确大小端) 

大小端

我们可以通过上图发现在给变量赋值时顺序是十六进制12345678,但在内存中显示的十六进制的顺序却相反了,由此我们可以引入一个概念 大小端 

  • 每个字节都有地址,所有的地址都是不同的,那么肯定是有大小的
  • 地址可以有高地址和低地址之分(按照字节为单位)

 int a = 0x12345678

  • 数据也要按照字节为单位划分成若干块
  • 数据按照字节为单位,也是有高权值和低权值之分的

大小端就是把高权值放在高地址处还是低地址处的问题? 

但是无论怎么放,只要用同等条件去取都可以

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中 

 

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中  

 最后祝大家端午安康!


http://chatgpt.dhexx.cn/article/S4kcLmxa.shtml

相关文章

【c语言】如何学好c语言?c语言应该怎么去学?

大家好,我是想要慢慢变得优秀的向阳同学,谢谢大家的支持!让我这个菜鸟博主可以有非常开心的收获1000的浏览量和200的粉丝!我也会不断努力去持续分享一下高质量的博客内容的!再次感谢大家的支持!如果觉得我的…

python open函数编码_python中的open函数如何编码?

python中的open函数可以通过在打开文件时添加encoding参数来指定使用的编码方式,encoding表示的是返回的数据采用何种编码。 open()的函数原型:open(file, mode‘r, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue) 从官方文档中我…

open函数和 write函数

问题 Python内置多种函数与第三方库,本文对python中的open()函数和 write函数进行简单的讲解。 方法 open()函数 open()函数用于创建或打开指定文件,该函数的常用语法格式: open(name[,mode[,buffering]]) name : 要创建或打开文件的文件名称&#xff0c…

python open函数用法_Python使用open函数打开文件的常用模式

python 中open()的用法? open("/path/to/my/image.png", "rb") 中的‘rb’代表了什么意思?所有试图感动你而做的事,最终都只感动了小编自己。 r表示只读,b表示二进制 与此对应的是w表示可写,t表示文本方式打开。 再增加一些官方的解释: >>>…

linux中open函数详解

1、open函数 包含头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> open函数有两个参数和三个参数 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); Pathname:要打开的文件名…

python open函数默认路径_Python open函数打开文件路径

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符,标示符r表示读。 >>> f = open(D:/test.txt,r) 注意了,对初学python的同学而言,open()函数着实存在一个不大不小的坑,而且十分不容易发现。 错误演示: >>> f = open…

linux open详解,Linux系统open函数详解

Linux系统中open函数主要作用就是打开和创建文件,可以根据参数来定制我们需要的文件的属性和用户权限等各种参数,下面良许教程网为大家分享一下Linux系统open函数具体使用方法。 一、open函数用来干什么 open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定…

第9.2节 Python的文件打开函数open详解

一、 引言 在操作一个文件前&#xff0c;大部分情况需要先打开文件&#xff0c;才能进行&#xff0c;在Python中使用内置函数open来打开一个文件。open函数是Python的一个内置函数&#xff0c;io模块 定义的函数open是该内置函数的同义词&#xff08;这是Python官网中关于io.op…

Python open 函数

open 函数语法 open() 函数的作用是打开一个文件,并返回一个 file对象(即文件对象)。 open 是一个动作,可以理解为我们打开文档的点击动作。 file 对象是一个实物,可以理解为我们打开的具体文档,例如记事本、表格、Word 或其他具体的文档。 open() 函数的语法为: f =…

Linux 文件IO学习之open函数深入了解

open()函数是在学习文件IO中的第一个函数。作用是打开一个文件&#xff0c;或者创建出一个文件。 需要注意的是&#xff0c;能实现这样功能的函数其实有两套&#xff0c;一个是系统IO所提供的open()函数&#xff0c;一个是标准IO提供的fopen()函数。(二者对比放在最后) 先看看…

Python open函数详解

演示环境&#xff0c;操作系统&#xff1a;Win10 21H2&#xff08;64bit&#xff09;&#xff1b;Python解释器&#xff1a;3.8.10。 open是Python的一个内置函数&#xff0c;一般用于本地文件的读写操作。用法如下。 my_file open(file, mode, buffering, encoding, errors…

sql去重查询

背景&#xff1a; 项目有消息推送&#xff0c;根据消息推送记录&#xff0c;筛选出一共有哪几种消息类型&#xff0c;并且标题和文本是什么 表部分结构如图&#xff1a; 主要是根据subject来去重所有数据&#xff0c;难点是&#xff0c;使用distinct的话&#xff0c;无法显示…

sql 去重查询 distinct

sql 去重查询 select Distinct UserId,Name from UserInfo where UserType1 介绍 distinct一般是用来去除查询结果中的重复记录的&#xff0c;而且这个语句在select、insert、delete和update中只可以在select中使用&#xff0c; 具体的语法如下&#xff1a; select distinc…

SQL去重的三种方法

目录 1.distinct去重 2.group by去重 3.row_number() over (parttion by 分组列 order by 排序列) 有这么一张test的表, 我们将对这张表进行操作来自验证去重 这里的去重&#xff1a;查询的时候, 不显示重复&#xff0c;并不是删除表中的重复项 1.distinct去重 只能一列去…

SQL去重方法汇总

更多教程请到友情连接&#xff1a; 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.cn 兴化论坛http://www.yimoge.cn 电白论坛 http://www.fcdzs.com 在使用SQL提数的时候&#xff0c;常会遇到表内有重复值的时候&…

SQL中去除重复数据的几种方法,我一次性都告诉你​

使用SQL对数据进行提取和分析时&#xff0c;我们经常会遇到数据重复的场景&#xff0c;需要我们对数据进行去重后分析。 以某电商公司的销售报表为例&#xff0c;常见的去重方法我们用到distinct 或者group by 语句&#xff0c; 今天介绍一种新的方法&#xff0c;利用窗口函数对…

SQL:数据去重的三种方法

1、使用distinct去重 distinct用来查询不重复记录的条数&#xff0c;用count(distinct id)来返回不重复字段的条数。用法注意&#xff1a; distinct【查询字段】&#xff0c;必须放在要查询字段的开头&#xff0c;即放在第一个参数&#xff1b;只能在SELECT 语句中使用&#…

SQL去重的三种方法汇总​

SQL去重的三种方法汇总​ 这里的去重是指&#xff1a;查询的时候, 不显示重复&#xff0c;并不是删除表中的重复项 1.distinct去重 注意的点&#xff1a;distinct 只能一列去重&#xff0c;当distinct后跟大于1个参数时&#xff0c;他们之间的关系是&&(逻辑与)关系&a…

SQL去重

SQL去重是数据分析工作中比较常见的一个场景&#xff0c;今天给大家具体介绍3种去重的方法。在使用SQL提数的时候&#xff0c;常会遇到表内有重复值的时候&#xff0c;比如我们想得到 uv &#xff08;独立访客&#xff09;&#xff0c;就需要做去重。 在 MySQL 中通常是使用 di…

SQL查询去掉重复数据

本文主要总结数据库去掉重复数据的方法 去掉重复数据的方法&#xff1a; 第一种&#xff1a;distinct 根据单个字段去重&#xff0c;能精确去重&#xff1b;作用在多个字段时&#xff0c;只有当这几个字段的完全相同时&#xff0c;才能去重&#xff1b;关键字distinct只能放…