从汇编学C语言_数据类型的强转

1.0基本的指令

movx 单纯的copy
%al = [10000000]
%bl = [00000000]
movb %al, %bl
after
%al = [10000000]
%bl = [00000000]

movsxx copy并且进行sign扩展
%al = [10000000]
%bl = [00000000 00000000]
movsbw %al, %bl
%al = [10000000]
%bl = [11111111 10000000]

movzxx copy并且进行0扩展
%al = [10000000]
%bl = [00000000 00000000]
movzbw %al, %bl
%al = [10000000]
%bl = [00000000 10000000]

1.1 有符号短数到有符号数长长

char a = 1; //0x01
int b = (int) a; //0x00000001
一条指令就可以
movsbl %dil %esi

1.2 有符号短数到无符号长数据

char a = -1 //0xFF
unsigned b = (unsigned)a; //0xFFFF
一样,进行符号扩充即可
movsbw %dil %si

1.3 短无符号到长有符号数

unsigned char a = 1; //0x01
long b = (long)a; //0x00000000000000000000000000000001
movzbq %dil %rax

1.4有符号长数 到 有符号短数

int sp; // rdi
char
dp; // rsi
dp = (char)sp
movl (%rdi) %eax
movb %ax %(rsi)
数据有可能丢失高位的信息,所以数据可能不准确

1.5无符号长整数 到 无符号短整数

unsigned int a = 0x10000000;
unsigned short b = (unsigned short)a;
movl (%rdi) %eax
movb %al %(rsi)
直接截断高位数据

总结

所有的强转都是用了movsxx or movzxx or movx 这样子的指令,理解这些指令能更好的理解c语言的类型强转。

posted @ 2021-12-08 17:59  哇哩顾得  阅读(168)  评论(0编辑  收藏  举报