【滴水逆向笔记】第十三章 C语言正向基础

系列文章目录


前言

一、变量的申明

告诉计算机,我要用一块内存

int a,b,c //全局变量的声明
void Fun()
{
   
    a = 10; //局部变量的声明
    b = 20;
}

总结:
声明就是告诉计算机,我要用一块内存,宽度和存储格式有数据类型决定
计算机给一块内存,取决于变量作用范围,全局变量在编译完就已经分配了内存空间,局部变量所在程序被调用才会分配空间
全局变量不定义值默认是0,但局部变量使用前一定赋初值

二、类型转换

从C语言角度来说,我们需要一个容器存储数据,我们认为一个char足够,我们不断往里面存值,发现不够了,得用另外一个内存来存

#inclde"stdafx.h"

void Fun()
{
   
    char c = 10;
    int i = c;
}

先看几行汇编

mov al,ff
movsx cx,al
mov al,80
movsx cx,al

这个是先符号扩展,再传送,ecx前面不变,就后面al变

mov al,ff
movzx cx,al
mov al,80
movzx cx,al

先零扩展,再传送,ecx前面都变成0了

扩展

#inclde"stdafx.h"

void Fun()
{
   
    char i = 0xff;
    short k = i;
    int h = i;
}

反汇编
在这里插入图片描述
如图,是movsx的形式,是有符号的
如果是undesigned,就是无符号

第二个例子

#inclde"stdafx.h"

void Fun()
{
   
    
    int ni = 0x12345678;
    short si = ni;
    char ci = ni;
}

如图,int是四个字节的,我们想看看能不能存储到更短的short,可以存进去,只是只能存储相对应位的低位,比如si上存5678,ci上就是78

如果两个不同类型的变量,结果是比较类型比较大的那个类型
反汇编代码如下
在这里插入图片描述

#inclde"stdafx.h"

void Fun()
{
   
    char b = 1;
    unsigned int a = 0xFFFFFFFE;
    printf("%d",a+b)
}

结果是-1,这里提个疑问,为什么是这样?
反汇编:

在这里插入图片描述
正常编程没有人这样写。。。。不管是怎么输入的,计算机都是存储一样的码
这里是printf%d就已经告诉他,这是有符号的了。。。。。

三.语句and程序块

void Fun(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值