【重学C语言】一、编程语言学前准备

什么是编程语言?

人类语言:语言就是人类进行沟通交流的表达方式,应用是生物同类之间由于沟通需要而制定的具有统一编码解码标准的声音(图像)指令

编程语言

  • 编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言,能够实现人与机器之间的交流和沟通,而计算机编程语言主要包括机器语言,汇编语言以及高级语言。
  1. 机器语言:机器语言是及其能够直接识别的程序语言或指令代码(即,用二进制表示的指令集合),无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码
  2. 汇编语言:即第二代计算机语言,用一些容易理解和记忆的缩写单词来代替一些特定的机器语言指令
  3. 高级语言:计算机语言具有高级语言和低级语言之分。而高级语言又主要是相对于汇编语言而言的,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。

电脑常识

文件后缀

即文件拓展名,就是表示一个文件的类型。不同类型的文件有不同的作用,同时也必须用不同的工具才能打开。比如常见的.txt、.mp3、.jpg、.rar这些就是后缀。每个文件的后面都是以.xxx结尾的。在编程时需要用到各种类型的文件,每种文件都有各自的拓展名,有的电脑默认显示,有的默认不显示,对于不显示的就要手动设置为显示
在这里插入图片描述

环境变量

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
当程序运行时,提供路径供程序查找所需要的库依赖。exe文件链接动态库时,首先会到exe的目录下找库,然后到环境变量找库,如果找不到库,就会报错:缺少库,程序无法运行。
在这里插入图片描述
在这里插入图片描述

命令行

英文名叫做Command Line。简单来说,就是输入"一行命令",来操控电脑执行任务。
打开命令行 :Win + R 输入 cmd 回车
在这里插入图片描述

常用 cmd 命令

dir:列出点钱目录下的文件以及文件夹
md:创建目录
rd:删除目录
cd:进入指定目录
cd..:退回到上一级目录
cd/:退回到根目录
del:删除文件
exit:退出 DOS 命令行

数据存储

计算机中常用进制就是二进制和十六进制,当然生活中有很多进制概念,例如每周的记录可以算是7进制,小时和天之间可以算是24进制,时分秒算是60进制。

  • 时间: 60进制 60s=1min 60min=1h
  • 天数: 24h=1day
  • 一打啤酒
  • 星期几
  • …….

常用进制表

进制运算方式表示数字编程语言中表示
二进制逢二进一010b开头,例如:0b1011
八进制逢八进一012345670开头,例如:0436
十进制逢十进一0123456789无特殊表示,数字默认十进制
十六进制逢十六进一0123456789ABCDEF0x开头,例如:0x4AF

相互转换

十进制转其他进制

短除法,从下往上行写即可
在这里插入图片描述

其他进制转十进制

加权法,从右往左数位数就是幂, 从第0位开始数
在这里插入图片描述

二进制与八进制与十六进制快速转换

三个二进制位等于一个八进制,四个二进制位等于一个十六进制,从后往前写,前面不够,往前补0
在这里插入图片描述

快速转换

在这里插入图片描述

二进制与存储

位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。

字节 byte:8个二进制位为一个字节(B),最常用的单位。

  • 1B(bytes) = 8bit
  • 1KB (Kilobyte 千字节)=1024B
  • 1MB (Megabyte 兆字节 )=1024KB
  • 1GB (Gigabyte 吉字节 )=1024MB
  • 1TB(Trillionbyte 太字节)=1024GB
  • 1PB(Petabyte 拍字节)=1024TB
  • 1EB(Exabyte 艾字节)=1024PB
  • 1ZB (Zettabyte 泽字节)= 1024 EB
  • 1YB (Yottabyte 尧字节)= 1024 ZB
  • 1BB (Brontobyte 波字节 )= 1024 YB

硬盘空间少比买的时候要少?

是因为 换算时他们将 1024 按照 1000来算

512G的硬盘:按1000来算 512G= ? Bytes

512G 硬盘 1K = 1000B 1M = 1000K 1G = 1000M = 100010001000B =1000000000B 512G = 512000000000B

512000000000/1024/1024/1024 B = 476.837158203125 G

二进制编码

机器数

机器数是将符号数字化的数,是数字在计算机中的二进制表示形式。机器数有2个特点

  • 数的符号数值化。实用的数据有正数和负数,由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号“+”或负号“-”,在机器里就用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位,称符号位,以0代表符号“+”,以1代表符号“-”。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。 例如二进制真值数-011011,它的机器数为 1011011。
  • 二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。

原码

基础概念

原码是最直观、最简单的表示方法。在原码表示法中,符号位位于最高位,0表示正数,1表示负数,其余位用来表示数值的大小。

计算方法

  • 对于正数,原码就是符号位加上真值的绝对值,即第一位表示符号,其余位表示值。例如,8位二进制数表示+1的原码为0000 0001。

  • 对于负数,原码也是符号位加上真值的绝对值(即该数的绝对值的二进制表示)。例如,-1的原码为1000 0001。

反码

基础概念

反码也是数值存储的一种方式,多应用于系统环境设置。反码是在原码的基础上,对于负数,符号位不变,其余各位取反(0变为1,1变为0)。正数的反码则与原码相同。

计算方法

  • 正数的反码与原码相同,例如,+1的反码为0000 0001。
  • 负数的反码,是在其原码的基础上,将符号位保持不变,其余各位取反。例如,-1的原码为1000 0001,其反码则为1111 1110。

补码

基础概念

在计算机系统中,数值通常使用补码来表示和存储。补码的设计使得符号位和数值域可以统一处理,同时加法和减法也可以统一处理。对于负数,补码是在反码的基础上加1得到的。

计算方法

  • 正数的补码与原码和反码都相同。
  • 负数的补码,是在其反码的基础上加1。例如,-1的反码为1111 1110,其补码则为1111 1111(因为1111 1110加1等于1111 1111)。

需要注意的是,补码的设计使得0的表示是唯一的,即正0和负0的补码都是0000 0000。同时,由于补码的设计,负数的表示范围比原码和反码多出一个数,即可以表示-128(对于8位二进制数)。

在计算机中使用补码进行计算的主要原因有以下几点:

  • 简化运算逻辑:补码设计使得计算机能够使用相同的加法器进行正数和负数的加法运算。通过将减法转化为加法运算,即通过对减数取补(负数)然后进行加法运算,可以极大地简化运算逻辑。
  • 统一处理符号位和数值域:补码表示法使得符号位和数值域可以统一处理,这有助于简化数值的比较和运算过程。
  • 提高表示范围:补码的范围比原码和反码的范围大一位。例如,对于一个8位的二进制数,原码和反码可以表示的范围是-127到127的整数,而补码可以表示的范围是-128到127的整数。这是因为补码用来表示0的编码与正数一致,从而提高了数值的表示范围。
  • 硬件电路简化:由于加法和减法可以通过同样的硬件电路实现,使用补码可以简化运算电路的设计和实现。这有助于降低计算机的制造成本和提高运算效率。

综上所述,补码的使用在计算机中具有重要意义,它简化了运算逻辑,提高了数值的表示范围,并有助于硬件电路的设计和实现。因此,在计算机系统中,数值一律用补码来表示和存储。

小数二进制

编程语言把小数分为两种,一种是单精度(float),一种双精度(double),计算中存储小数分为指数部分和尾数部分。
在这里插入图片描述
小数转换为二进制的方法主要是采用“乘2取整法”。具体步骤为:将小数部分乘以2,取出乘积的整数部分作为二进制的一位,再用剩下的小数部分继续乘以2并取整数部分,直到小数部分为0或达到所需的精度为止。

例如,将十进制小数0.125转换为二进制:首先,0.125乘以2得到0.25,取出整数部分0;接着,0.25乘以2得到0.5,取出整数部分0;最后,0.5乘以2得到1,取出整数部分1。因此,0.125的二进制表示为0.001。

为什么小数不精准

二进制数是连续的,但是转换结果是不连续的。导致了浮点数不精准。

二进制数对应的十进制数
00
0.00010.0625
0.0010.125
0.00110.1875
0.010.25
0.01010.3125

验证代码如下:

#include <stdio.h>

int main(int argc, char* argv[]) {
	float sum = 0.0f;
	for (size_t i = 0; i < 100; i++) {
		sum = sum + 0.1f;
	}
	// 推测:sum = 10.0
	printf("sum = %f\n", sum);
	return 0;
}

在这里插入图片描述

位运算

位运算是计算机中进行二进制操作的一种方法,可以对二进制数的单个比特位进行操作,包括位移、按位与、按位或、按位异或、按位取反等。位运算在计算机领域有着广泛的应用,特别是在处理二进制数据和优化性能时非常有用。

位运算的一些常见应用包括:

  • 内存管理:程序常常需要对内存地址进行位运算,以判断对齐、分页和分段等问题。
  • 加密解密:位运算可以用于加密和解密算法中,提高运算效率并增加加密强度。
  • 逻辑推理:位运算还可以进行逻辑推理,例如二进制数的“灰码编码”等,常用于工业自动化和数字信号处理领域等。

此外,位运算还有一些特殊的性质和应用,例如交换两个数(字符)而不用第三个变量,通过异或运算可以实现。

常见的编程语言,如Python、C、Java等,都提供了丰富的位运算符,可以方便地进行位运算操作。例如,在C语言中,有&(按位与)、|(按位或)、~(按位取反)、^(按位异或)、<<(左移)、>>(右移)等运算符。

  1. 按位与运算(&):将两个操作数的对应位都为1时,结果的对应位才为1,否则为0。例如,5的二进制表示为101,3的二进制表示为011,进行按位与运算后得到001,即1。
  2. 按位或运算(|):将两个操作数的对应位中至少有一个为1时,结果的对应位为1,否则为0。以5和3为例,按位或运算后得到111,即7。
  3. 按位异或运算(^):将两个操作数的对应位不相同时,结果的对应位为1,否则为0。
  4. 按位取反运算(~):将操作数的每一位取反,即将0变为1,将1变为0。
  5. 左移运算(<<):将操作数的二进制表示向左移动指定位数,右侧空出的位用0填充。这相当于算术乘以2的指定次方。
  6. 右移运算(>>):将操作数的二进制表示向右移动指定位数,左侧空出的位用符号位填充(正数用0,负数用1)。这相当于算术除以2的指定次方。

总之,位运算是计算机编程中的重要概念,掌握它有助于更深入地理解计算机底层的工作原理,并优化程序的性能。

大小端

大小端(Endian)是计算机存储数据的一种方式,它决定了数据在内存中的存储顺序。在计算机系统中,数据在内存中的存储是以字节为单位的,每个字节有一个唯一的地址。在存储多字节的数据时,计算机可以选择不同的字节存储顺序,即大小端。

具体来说,大端模式是指将高序位字节存储在起始地址,而小端模式则是指将低序位字节存储在起始地址。例如,对于一个4字节的整数0x12345678,按照大端模式和小端模式的不同存储方式如下:

  • 大端模式:地址从低到高为0x10、0x20、0x30、0x40,对应的字节为0x12、0x34、0x56、0x78。
  • 小端模式:地址从低到高同样为0x10、0x20、0x30、0x40,但对应的字节为0x78、0x56、0x34、0x12。

可以看到,在大端模式中,低地址存放高位字节,高地址存放低位字节;而在小端模式中,低地址存放低位字节,高地址存放高位字节。从上面的例子也可以看到,在大端模式中,第一个字节的最高位是整个4字节整数的最高位,而在小端模式中,第一个字节的最低位是整个4字节整数的最高位。

在计算机内部,通常采用的是小端存储方式。了解大小端的概念对于理解计算机底层的工作原理以及进行跨平台编程和数据传输非常重要。因为在不同的计算机系统或网络协议中,可能采用不同的字节序,如果不加以处理,就可能导致数据解析错误。

应用场景

  • 处理器架构:不同的处理器架构可能采用不同的字节序。例如,x86处理器采用的是小端字节序,而MIPS处理器采用的是大端字节序。这意味着在编写跨平台代码时,需要考虑不同处理器架构对字节序的影响。
  • 文件格式:不同的文件格式可能采用不同的字节序。例如,Windows平台上的PE文件格式采用的是小端字节序,而Unix/Linux平台上的ELF文件格式采用的是大端字节序。因此,在解析或生成不同格式的文件时,需要正确处理字节序问题。
  • 网络传输:网络传输协议规定了数据传输的字节序。例如,TCP/IP协议规定了网络传输的字节序为大端字节序。在跨硬件平台进行数据传输时,由于数据格式可能存在差异,存储字节的顺序可能不同,因此需要进行大小端数据的转化。
  • 芯片字节序:芯片字节序通常为大端,这更符合人类的阅读习惯。
  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasonakeke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值