本节必须掌握的知识点:
示例六源代码
代码分析
汇编解析
3.1.1 示例六
在数学中数字有一定的特征,比如整数、小数、负数等。在C语言中对数据也有一定的特征,我们称为数据的类型。
数据类型确定了变量的取值范围,所占的内存空间大小。我们可以结合两个问题去学习数据类型,第一个能存储多少数据;第二个存储什么格式的数据。如何知道不同的数据类型能存储几个字节呢? 比如示例代码六中使用的是int 类型的整型变量,能存储4个字节32位有符号整数。
示例代码六
/*
sizeof取数据类型字节数
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0; //声明int类型变量
printf("int 存储大小 : %u \n", sizeof(i));//sizeof取数据类型字节数
system("pause");
return 0;
}
●输出结果:
int 存储大小 : 4
请按任意键继续. . .
3.1.2 代码分析
示列代码六中,sizeof在C语言中是判断数据长度符的关键字,用于检测数据类型长度。
■sizeof的语法
●sizeof( type_name ); // sizeof( 类型 );用于数据类型
●sizeof( object); // sizeof( object );用于对象
●sizeof object; // sizeof 对象;用于对象
printf函数的第一个参数中使用了’%u’格式说明符,表明输出unsigned int类型的格式数据,即sizeof运算符取的数值为unsigned int类型数据(无符号整数),均为正整数。
3.1.3 汇编解析
■汇编代码
;C标准库头文件和导入库
include vcIO.inc
.data ;全局区
i sdword 0 ;全局变量
.const ;常量区
szMsg db "int 存储大小 : %u ",0dh,0ah,0
.code ;代码区
start:
mov eax,sizeof i
push eax
push offset szMsg ;格式化常量字符串偏移地址入栈
call printf ;调用printf函数输出结果
;
invoke _getch ;等待输入单个字符
ret ;结束返回
end start
●输出结果:int 存储大小 : 4
由上述汇编代码可知,C语言中的sizeof关键字直接取自汇编语言的操作符sizeof,功能相同,语法稍有不同而已。
■反汇编代码
int i = 0; //声明int类型变量
009A1838 mov dword ptr [i],0
printf("int 存储大小 : %u \n", sizeof(i));//sizeof取数据类型字节数
009A183F push 4
009A1841 push offset string "int \xb4\xe6\xb4\xa2\xb4\xf3\xd0\xa1 : %u \n" (09A7B30h)
009A1846 call _printf (09A104Bh)
009A184B add esp,8
由反汇编可知,sizeof(i)的值是由编译计算的,没有对应的汇编指令,直接将结果4 push 入栈。
本文摘自编程达人系列教材《汇编的角度——C语言》。