跟“龙哥”学C语言编程day1

本文详细阐述了程序的编译过程,包括预处理、编译、汇编和链接,以及生成的.obj和.exe文件的区别。同时,介绍了C语言的数据类型,包括基本类型、构造类型、指针类型和空类型。讲解了常量、变量、符号常量的概念,以及整型常量的进制表示和溢出问题。此外,还深入探讨了浮点型常量的表示和精度控制。通过对各种数据类型的解析,帮助理解计算机内部如何存储和处理数据。
摘要由CSDN通过智能技术生成

程序编译过程

1、编写源程序f.c
2、通过编译器进行编译,编译包括预处理、编译、汇编
3、f.c经过编译之后,得到f.obj文件,f.obj文件中均是0/1类型的机器码,即CPU能够识别的微指令。f.obj文件并不能执行,因为我们调用的标准库函数的代码并不在f.obj文件中。
4、经过链接就得到可执行文件f.exe。

数据类型分类

*基本类型
整型 int
字符型 char
实型(浮点型)单精度实型 双精度实型

*构造类型
数组类型 [ ]
结构类型 struct
联合类型 union
枚举类型 enum

*指针类型
指针 *

*空类型(无值类)
void

常量

常量是指在程序运行过程中,其值不发生变化的量。
分为:
1、整型
2、实型(也称浮点型)
3、字符型
4、字符串型

整型常量、实型常量、字符型常量是在编译时可以直接编入代码段的常量;字符串型常量是指存放在字符串型常量区中的常量。

变量

变量代表内存中具有特定属性的一个存储单元,它用来存储数据,即变量的值。这些值在程序的执行过程中是可以改变的。

变量名 实际上以一个名字代表一个对应的存储单元地址。编译、链接程序时,由编译系统为每个变量名分配对应的内存地址。从变量中取值实际上是通过变量名找到内存中存储单元的地址,并从该存储单元中读取数据。

符号常量

使用#define 定义的内容是常量的原因是:
在预处理的过程中会消除所有的define,编译器在预处理后会把代码相应的地方替换为define的内容。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打开main.i文件滚动到末尾会发现直接将CODE部分直接替换为宏定义的内容,也正是因为这样,说明了宏定义的内容不可修改,只能是常量。

整型常量的不同进制表示

计算机中只能存储二进制,即0/1,对应的物理硬件上是高、低电平。
在计算机中,1字节是8位,1位即二进制的1位,它存储0/1。
int型常量的大小为4字节,即32位。
设二进制数 0100 1100 0011 0001 0101 0110 1111 1110,其最低位是2的0次方,最高位是2的30次方,最高位是符号位。
1GB=1024MB
1MB=1024KB
1KB=1024B
我们的32位控制台应用程序的地址范围是从0-4G,即从0x00000000一直到0xFFFFFFFF
如图,称为进程地址空间。

在这里插入图片描述程序编译完毕,开始执行时,会被放入进程地址空间的代码段区域。执行到哪条语句,PC指针就指向该条语句对应的地址。
在这里插入图片描述
为什么显示结果是7b 00 00 00而不是00 00 00 7b,原因是英特尔的CPU采用了小端方式进行数据存储,因此低位在前、高位在后。

ps:执行到int i=0x7b,变量i会在栈空间上被分配空间,大小为4字节。

补码的作用

计算机的CPU无法做减法操作,只能做加法操作。
CPU中有一个逻辑单元叫加法器。计算机所做的减法、乘法、和除法,都是通过加法器将其变化为加法实现的。
计算机正数是按照原码存储的,负数是按照补码存储的。
例如:5的二进制数为101,称为原码,计算机用补码表示补码,
补码是对原码取反加1后的结果,即101取反加1用16进制表示为0xfffffffb;
2+(-5),计算机存储的是0xfffffffd,因为最高位为1,对其进行取反加1(与减1取反效果相同),取反后为0x00000002,加1为0x00000003,结果为3,最终为-3。

整型变量

整型变量包括6种类型,其中有符号基本整型与无符号基本整型的最高位所代表的意义不同,有符号最高位为符号位,无符号最高位是数据的第一位
超出范围会发生溢出现象。
基本整型 int 4字节 范围 -2^31~ 2 ^31-1
短整型 short 2字节 -2^15~ 2 ^15-1
长整型 long 4字节(64位为8字节) -2 ^31~ 2 ^31-1(-2 ^63~ 2 ^63-1)
无符号基本整型 unsigned int 4字节 范围 0~ 2 ^32-1
无符号短整型 unsigned short 2字节 0~ 2 ^15-1
无符号长整型 unsigned long 4字节(64位为8字节) 0~ 2 ^32-1(0~ 2 ^64-1)
以有符号短整型为例,为什么1000 0000 0000 0000
用来表示-2^15 对于16位的短整型,通过排列组合可以知道负数可以有-1~-2 ^31-1,但是1000 0000 0000 0000却没有表示任何数,因为0是0000 0000 0000 0000表示是0,只能有一个0,而1000 0000 0000 0000只能用来表示-2 ^16.

溢出问题

假设short类型i=0x7fff,在这里插入图片描述复制后:
在这里插入图片描述
因为short是两个字节,所以再加1之后,会溢出,变成0x8000,因为0x8000是以补码存储,所以0x8000表示计算机的-2 ^16.
要解决溢出问题,就使用能够存储比当前位数更多的类型来存储。

浮点型常量

1、小数形式 0.123
2、指数形式 3e-3(为3*10 ^-3)
字母e之前必须有数字且指数后一定为整数

浮点型变量

使用float 、double关键字定义浮点型变量
float占用的内存空间是4字节
double占用的内存空间是8字节
与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。
系统把一个浮点型数据分为小数部分和指数部分。
在这里插入图片描述符号位 0正 1负
指数部分:IEEE-754的规定,指数部分运算前都要减去127,例如:1000 0001为129
所以指数部分为129-127=2,所以指数部分为2
小数部分:底数左边省略了1,例如:0010 0000 0000 0000 0000 000 实际上是1.00100000000000000000000,下面以4.5(十进制)举例计算:
计算机不能计算10的幂次方,只能计算2的2次幂,所以指数值为2,代表2的2次幂,也因此左移两位,所以为100.1,2 ^2+2 ^-1=4.5,浮点数的小数是通过2 ^-1+2 ^-2±—来近似一个小数的。

浮点数的精度控制

单精度(float)
双精度(double)
长双精度(long double)
因为浮点数使用的是指数表示法,所以不用担心数值范围,也不用看浮点数的内存。需要注意的是浮点数精度问题,以float为例,小数部分为23位,最大不超过2 ^23=8388608,最多表示7位数,且不是全部7位都能表示所以有效位数为6-7位

float 位数32位 有效数字6-7位
double 64位 有效数字15-16位
long double 128位 18-19位
(有效位数记忆一下)
西药注意精度丢失现象,比如float类型,在有效位数超过7位后进行运算会发生精度丢失,(7位也有可能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值