小杨同学的变强之路(c语言篇-前提基础)

一.进制转换(二进制,十进制,十六进制)

1.十进制与十六进制(0x开头)互相转换

十进制转十六进制

例:十进制 120

转换为十六进制时:

120 / 16 = 7 余8

7 / 16 = 0 余7

十六进制为:0x78

例:十进制 158

158 / 16 = 9 余14 在十六进制中14用E表示

9 / 16 = 0 余9

十六进制为:0x9E

总结:在十进制转换为十六进制时,每次除以16余数分别为十六进制的个位丶十位......

十六进制逢16进1,从10开始用A B C D E F 表示。

十六进制转十进制

例:十六进制 0x2AF5

第0位:5 * (16^0) = 5

第1位:15 * (16^1)= 240

第2位:10 * (16^2)= 2560

第3位:2 * (16^3)= 8192

十进制:8190 + 2560 + 240 + 5 = 10995

2.二进制与十六进制互相转换

二进制(0b开头)

        二进制每4位一分,权值分别为8 4 2 1

二进制转十六进制

例:0b1111 = 8 + 4 + 2 + 1 = 15  即为十六进制的F

        0b1110 = 8 + 4 + 2 + 0 = 14 即为十六进制的E

         0b1101 = 8 + 4 + 0 + 1 = 14 即为十六进制的D

             .

             .

        0b0000 = 0 + 0 + 0 + 0 = 0 即为十六进制的0

总结:二进制的每四位为一组,权值分别为8 4 2 1,转换时对应位为1则赋予对应权值,若为0则赋予值0

例:0b111111011010010110011011

四位一分:1111,1101,1010,0101,1001,1011

分别对应:   F  ,   D  ,   A   ,   5   ,   9   ,   B

因此十六进制为:0xFDA59B

十六进制转二进制

例:0xFD

F为15,由 8 4 2 1 四个数字凑成 ,所以二进制表示为0b1111

D为13,由 8 4 0 1四个数字凑成,所以二进制表示为0b1101

0xFD转换为二进制表示为0b11111101

总结:十六进制转为二进制时,用 8 4 2 1四个数字去凑,哪一位为0,则二进制对应位置也为0

3.十进制与二进制相互转换

互相转换时以16进制为中间变量,由二进制转为十进制时先转为十六进制在转换为十进制,

十进制转换为二进制时同理。

二.gcc编译与gdb调试

1.gcc 编译c代码

例:编写c程序,文件名为main.c

命令行键入:gcc main.c   //编译C程序,默认生成a.out执行文件

命令行键入:gcc -v main.c 显示详细的编译过程信息

 编译后生成a.out 执行文件 命令行键入:./a.out    //运行程序

2.gdb调试

$ gcc -g  main.c  //编译生成带有调试信息的执行文件a.out
$ gdb a.out //调试程序
$ l     //list: 查看源码(默认10行)
        //list 8  查看8行附近的代码
        //list main 查看函数名附近的代码
$ b 5   //break: 在第5行设置断点
$ r     //run: 运行到断点处(如无则运行直到结束)
$ s     //step: 单步执行(如果是函数则进入)
$ n     //next: 单步跳过(如果是函数则跳过)
$ p a   //print: 查看变量内容
        // p &a  查看变量a的地址
        // p &b+1   b变量的地址根据数据类型递增(int型 会加4,char型则加1)
        // p *(&b+1)
        // p a[1] 
        // p *p1 查看p1指针里的内容 
        // p  add(4,7)  调用函数add 并打印返回值
$ p/t b // t  二进制显示 变量的值  
	// x  按十六进制格式显示变量。
	// d  按十进制格式显示变量。
	// u  按十六进制格式显示无符号整型。
	// o  按八进制格式显示变量。
	// a  按十六进制格式显示变量。
	// c  按字符格式显示变量。
	// f  按浮点数格式显示变量。      
$ x &a  //显示某地址的内存值 
        //例如 float a = 0.45; 的内存值为
        // 0x7fffffffdf8c:	00111110111001100110011001100110        
上下键  //可查看历史命令
$ bt     //查看堆栈信息 (如嵌套调用多个函数时)
$ c      //continue: 继续执行程序(直到下一个断点或者结束)
$ q      //quit: 退出gdb调试
$ dmesg  //查看内核信息     

三.如何编译生成执行文件

 编译流程:main.c --> 预处理 --> 编译 --> 汇编 --> 连接 --> a.out

编译时可以同时编译多个文件,生成执行文件 a.out,例:gcc main.c fun.c

//----main.c
#include <stdio.h>
extern int sub(int a,int b); //声明 使用外部文件的函数
#define MY_NAME "yzg"

int main()    
{    

   int b=3;
   int c=5;
   int ret=0;
   
#ifdef TEST   //条件编译 当定义#define TEST 才编译进来
   ret = sub(c,b);
   printf("helloworld %d\n",ret);  
#endif    
   printf("my name is %s \n",MY_NAME);
   return 0;   
}

//---fun.c
int sub(int x,int y)
{
    return x-y;
}

预处理:

gcc -E main.c -o main.i //停在预处理阶段(生成 main.i文件)

                                     //发现宏被替换了,条件编译生效

编译:

gcc -S main.c //停在编译阶段(生成汇编文件 main.s)

汇编:

gcc -c main.c //停在汇编阶段(生成目标文件 main.o )

vim main.o //16进制显示 二进制文件

                  //在命令行模式下输入 :%!xxd  可以查看二进制的文件

链接:

gcc -c fun.c

gcc main.o fun.o //链接目标文件或库文件(.a .so),生成执行文件 a.out(.bin .exe)

                           //独立的目标文件都是从0地址开始,需要链接来重新合并安排地址

                           //链接异常 会报 collect2: error: ld returned 1 exit status

objdump -d a.out //查看反汇编代码

                            //可查看 objdump -d fun.o 等看链接过程是如何把代码嵌入式到main.o中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值