Linux C基础 (2)

本文详细介绍了计算机的基本结构,包括输入输出设备、CPU、内存和外存,解释了程序的概念及其设计步骤。内容还涵盖了数据的表示,包括数值和非数值数据,以及进制转换方法。此外,文章还讨论了C语言中的基本数据类型、常量和字符编码。
摘要由CSDN通过智能技术生成
 1、计算机的基本结构
 2、什么是程序
 3、程序的设计步骤
 4、计算机的数据表示(进制转换)
 5、基本数据类型
 6、常量

1、计算机的基本结构

 组成:
 输入输出设备(键盘、鼠标)
 CPU处理器(控制器、运算器、寄存器)
 存储器
 程序
 ​
 存储器:
 内存:工作存储器,容量较小,读写速度快,掉电会丢失数据
 外存:长期保存数据,容量较大,读写速度慢,掉电不会丢失数据
 寄存器:CPU内部的存储器,容量较小,读写速度最快

2、什么是程序

程序:计算机能够识别的一组有序的指令(数据结构+算法)

指令:计算机能够识别的操作

hello.c和a.out哪个是程序?a.out

3、程序的设计步骤

 编辑(vim)代码-->编译(gcc)程序-->执行程序/调试程序(./a.out)

4、计算机的数据表示

分为:数值数据和非数值数据

4.1 非数值数据

非数值数据(不能够直接进行算术运算的数据):字符、图片、视频、声音

'a' 'b'

ASCII码(十进制):规定了每一个字符在计算机中对应的是哪八位的二进制数(1byte = 8bit)

4.2 数值数据

数值数据(能够直接进行算术运算的数据)

二进制、八进制、十进制、十六进制

 二进制:0、1
 八进制:0 ~ 7
 十进制:0 ~ 9
 十六进制:0 ~ 9,a(A) ~ f(F)//前后大小写保持一致

为了区分不同的进制,八进制签名加0,十六进制签名加0x

23(十进制) 023(八进制) 0x23(十六进制) 

4.3 进制转换

 二进制转成十进制:1001 --->1*2^3 + 0*2^2 + 0*2^1 + 1*2^0
 八进制转成十进制:066 --->6*8^1 + 6*8^0
 十六进制转成十进制:0xacdf -->10*16^3 + 12*16^2 + 13*16^1 + 15*16^0
 十进制转成二进制:除2倒取余
 十进制转成八进制:除8倒取余
 十进制转成十六进制:除16倒取余

二进制八进制:

 000 ---- 0
 001 ---- 1
 010 ---- 2
 011 ---- 3
 100 ---- 4
 101 ---- 5
 110 ---- 6
 111 ---- 7

二进制与十六进制

 0000 ---- 0
 0001 ---- 1
 0010 ---- 2
 0011 ---- 3
 0100 ---- 4
 0101 ---- 5
 0110 ---- 6
 0111 ---- 7
 1000 ---- 8
 1001 ---- 9
 1010 ---- a(小写的a和大写的A都可以)
 1011 ---- b
 1100 ---- c
 1101 ---- d
 1110 ---- e
 1111 ---- f

0x8fea         ---> 1000 1111 1110 1010

8421

1110->8         0100->4         0010->2         0001->1

练习

 1、实现其它进制转成10进制
     1011 0110= 1*2^7 + 1*2^5 + 1*2^4 + 1*2^2 + 1*2^1 = 128 + 32 + 16 + 4 + 2 = 182
     0345 = 3*8^2 + 4*8^1 + 5*8^0 = 192 + 32 + 5 = 229
     0xaf23 = 10*16^3 + 15*16^2 + 2*16^1 + 3*16^0 = 40960 + 3840 + 32 + 3 = 44835
 2、将10进制转成二进制:987 = 0011 1101 1011
 3、将8进制转成二进制:0734 = 111 011 100
 4、将16进制转成二进制:0xffa76 = 1111 1111 1010 0111 0110
 5、将二进制分别转成8进制和16进制
     101 011 010 001 = 05321 = 0xad1

5、基本数据类型

5.1 关键字

关键字:系统预定义的,有特定含义,全部都是小写,不允许用户重新定义,一共有32个

 C语言是强数据类型语言,对数据类型区分
 数据类型:char、double、float、int、long、short、struct、union、void、enum
控制语句:break、case、continue、default、do、else、for、goto、if、switch、while
 存储类型:auto、static、extern、register
 const:只读
 return:返回函数
 signed:有符号数
 sizeof:计算空间的大小(单位:字节)
 typedef:给数据类型起别名
 unsigned:无符号数
 volatile:防止编译器优化

5.2 标识符

标识符:程序员自己定义的,一般用来定义变量名、函数名、类型名

命名规则

 (1)有数字、字母、下划线组成
 (2)第一个字符不能为数字
 (3)不能和关键字重名
 (4)见名知意

5.3 转义字符

5.4 数据类型

输出

 printf("格式控制串",输出表);
 格式控制串:原样输出的内容 + 格式化符(%d,%c);
 输出表:要输出的对象
 例如:输出一个变量int a = 5的值
 printf("a = %d",a);
 ​
 %ld用来输出长整型数。
 %d用来输出整型数。
 %ld 的话 输出的字节要长点, %d 的要短点。比如,一个数大于32767 用%d 就要溢出。假如你想输出32768.用%d 就会输出-1.这就是溢出。但是用%ld 就不会。它能接受的数的范围大些!

5.4.1 32OS

 字符型:char(1byte)
 整型:int(4byte)、long(4byte)、short(2byte)
 浮点型:float(4byte)、double(8byte)

5.4.2 64OS

 字符型:char(1byte)
 整型:int(4byte)、short(2byte)、long(8byte)
 浮点型:float(4byte)、double(8byte)

注意:每一种数据类型所占大小不一样,数据类型只要是让我们合理分配内存空间(32和64位,唯一值差异为long数据类型)

5.5 有符号数和无符号数

signed:数值有正负之分,以补码的形式存储

作用:声明有符号类型的整数类型

 一、为什么需要补码
 计算机的 CPU 是无法做减法操作的,只能做加法,其实 CPU 中有一个逻辑单元叫加法器,计算机所做的减法,乘法,除法,都是由科学家将其变化为加法。
 其实 2-5,实际所使用的方法是 2+(-5)进行的,而计算机只能存储 0 和 1,所以借用补码实现减法操作。

最高位是符号位,正数的符号位是0,负数的符号位为1

注意:符号位不参与运算

正数:原码、反码、补码都是一样的

比如:10 --->0000 1010

 负数:-10
 原码:1000 1010
 反码:1111 0101
 补码:1111 0110
 1000 1001
 1000 1010

负数:

原码-->补码:取反加1

补码-->原码:(1)减一取反 (2)取反加1(补码的补码是原码)

 负数:-20
 原码:1001 0100
 反码:1110 1011
 补码:1110 1100
 1110 1011 = 1001 0100(-1,取反)
 1001 0011 = 1001 0100(取反,+1)

unsigned:只有正数,原、反、补一致

作用:声明无符号的整数类型

无符号数在计算机中的表示方法:计算机用原码表示无符号数
-无符号数默认为正数n
-无符号数没有符号位无符号数最小值为0,最大值为其所占的位数全为1时的值。
printf("%d, %u", a, b); /* %u是unsigned类型的说明符 */
printf("%u, %d", a, b); /* 如果对signed类型的变量用%u,那就不会去找内存中的符号位,全部当数字位处理 */
/* 这时显示的结果可能与signed本身想表达的值差异很大,数字0情况除外 */
unsigned short c = 4;
printf("%hu"); /* %h是短整型,%hu表示无符号短整型 */
unsigned long d = 5;
printf("%lu"); /* %l是长整型,%lu表示无符号长整型 */

5.6 字符型

值域范围:
char(1byte): 1byte = 8bit
unsigned:0000 0000 ~ 1111 1111 0 ~ 255
signed:1000 0000 ~ 0111 1111 -128 ~ 127
值域范围:
int(4byte)
unsigned:
0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111
1111 0 ~ 2^32-1
signed:-2^31 ~ 2^31-1

案例

(1)char a = 130; 1000 0010  2
printf("a = %d\n",a);
(2)unsigned char a = 260;
printf("a = %d\n",a);
1、已知值域范围,可求越界
2、先将其转换为二进制,截取其数据类型有效位数,其余舍弃

5.7 浮点型

浮点型的存储方式和整型存储方式是不一样的

浮点型的存储方式决定了它不能准确的表示一个数,只能近似的表示某一个数

float(4byte):有效数据的位数一般是6~7位,余处位数不再精确,可能为随机值

double(8byte):有效数据位的位数一般是15~16位

6、常量

在程序运行期间不会发生改变的量(从程序开始到结束都不会发生改变的量)

6.1 字符常量

'a' 'b' 'c' 'd'

6.2 整型常量

二进制:1101
八进制:077
十进制:24
十六进制:0xAF
注意:默认情况下,整型常量是有符号的int类型
无符号的整型常量:66U
长整型:66L
无符号的长整型:66UL

6.3 浮点型常量

小数形式:1.23 0.0001 10000(浮点型常量包含整型常量)

%g会自动选择小数形式或指数形式表示

指数形式:0.0001 (1e-4) 10000(1e+4)

6.4 字符串常量

“hello” <==> {'h','e','l','l','o','\0'}占几个字节

**注意:字符串是以'\0作为结束符'**

6.5 标识常量(宏)

#define 宏名 表达式

注意:

(1)宏名一般用大写来表示,小写也可以,因为为了和变量区分,所以用大写

(2)宏后面没有分号

注意:宏只是单纯的替换

宏函数(既有宏的特点又有函数的特点)

#define 函数名(形参) 函数体

案例1:利用宏函数实现两个数的求和

注意:使用宏函数时必须加上括号

注意:宏只是单纯的替换,不会考虑运算符优先级的问题,所有每个变量以及整个表达式添加括号

作业

求short值域范围

值域范围:
short(2byte): 2byte = 16bit
unsigned:0000 0000 0000 0000 ~ 1111 1111 1111 1111 0 ~ 2^16-1
signed:1000 0000 0000 0000 ~ 0111 1111 1111 1111 -2^15 ~ 2^15-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值