整数的编码
带符号整数: char、short、int、long
无符号整数: unsigned
1.在test目录下新建manu.c,并输入以下代码
#include "stdio.h"
void main( )
{
int ai = 100, bi = 2147483648,ci = -100;
unsigned au = 100, bu = 2147483648, cu = -100;
printf("ai=%d, bi=%d, ci=%d \n", ai, bi, ci);
printf("au=%u , bu=%u, cu=%u \n", au, bu, cu);
}
2.编译运行,并输出相应的结果
3.反汇编该文件
ai、bi、ci为非静态局部变量,执行程序时被存放在栈帧中
100, 2147483648, -100可以看做是这个程序的常数,把这些常数赋值给这些整型变量,并且放在栈帧中时,编译程序就把这些常数直接编码在机器指令中。
objdump -S manu>manu.txt
带符号整数和无符号整数的编码
真值与机器数
十进制 | 二进制 | 十六进制 | 编码 | 说明 |
---|---|---|---|---|
100 | 0110 0100 | 64H | 00000064H | |
2147483648 | 80000000H | 80000000H | ||
-100 | -0110 0100 | -64H | 0FFFFFF9CH | 补码 |
int类型32位,4个字节
变量 | 类型 | 机器数 | 真值 |
---|---|---|---|
bi | int | 80000000H | -2147483648 |
cu | unsigned | FFFFFF9CH | 4294967196 |
总结
带符号整数:补码 (符号+数值)
无符号整数:二进制编码 (数值)
浮点数的编码
1.在test目录下新建intfloat.c,并输入以下代码
#include "stdio.h"
void main( )
{
int ai = 100, bi = -100;
float af = 100, bf = -100;
printf("ai=%d, bi=%d \n", ai, bi );
printf("af=%f , bf=%f \n", af, bf );
}
2.编译运行,使用objdump反汇编该文件
3.ai=100,af=100当所对应的机器数不相同,int类型采用的是补码的编码,float类型采用的是浮点数编码
补码编码的特点:ai和bi 都是补码的编码,对于两个相反数,它们的机器数的01序列满足“按位取反,末位加1”
浮点数的编码特点:对于两个相反数,它们机器数的01序列中,正数的符号位为0,负号的符号位为1,阶码和尾数部分一样
总结
带符号整数:采用补码的表示,如int类型(1位符号+数值)
无符号整数:二进制的表示,如unsigned int 类型(数值)
浮点数:采用IEEE 754标准,如float类型(1位符号+8位阶码+23位尾数)