计算机底层数据的处理方式(汇编后将所有数据都转化为补码二进制数据,所有类型信息都会消失)
编程语言是怎么实现类型转换的,而计算机底层又是怎样处理各种类型数据的呢,好吧,源码说明一切。
code.c
- int test()
- {
- unsigned char a=129;
- char b=130;
- char c=a;
- int h=a;
- char d=-2;
- unsigned char e=d;
- int i=d;
- int j=a+d;
- int k=-3;
- int l=257;
- char m=k;
- char n=l;
- unsigned char p=k;
- unsigned char q=l;
- }
将之汇编为code.s汇编代码:
code.s
- subl $32, %esp
- movb $-127, -1(%ebp) //立即数都转换为相应类型所占位数下的补码数据
- movb $-126, -2(%ebp)
- movb -1(%ebp), %al
- movb %al, -3(%ebp)
- movzbl -1(%ebp), %eax
- movl %eax, -8(%ebp)
- movb $-2, -9(%ebp)
- movb -9(%ebp), %al
- movb %al, -10(%ebp)
- movsbl -9(%ebp), %eax
- movl %eax, -16(%ebp)
- movzbl -1(%ebp), %edx
- movsbl -9(%ebp), %eax
- addl %edx, %eax
- movl %eax, -20(%ebp)
- movl $-3, -24(%ebp)
- movl $257, -28(%ebp)
- movl -24(%ebp), %eax
- movb %al, -29(%ebp)
- movl -28(%ebp), %eax
- movb %al, -30(%ebp)
- movl -24(%ebp), %eax
- movb %al, -31(%ebp)
- movl -28(%ebp), %eax
- movb %al, -32(%ebp)
汇编后的obj文件的反汇编代码:
- code.obj: file format pe-i386
- Disassembly of section .text:
- 00000000 <.text>:
- 0: 83 ec 20 sub $0x20,%esp
- 3: c6 45 ff 81 movb $0x81,-0x1(%ebp) //unsigned char a=129; 129转换为补码
- 7: c6 45 fe 82 movb $0x82,-0x2(%ebp) //char b=130; 130转换为补码
- b: 8a 45 ff mov -0x1(%ebp),%al
- e: 88 45 fd mov %al,-0x3(%ebp)
- 11: 0f b6 45 ff movzbl -0x1(%ebp),%eax //int h=a; 0扩展
- 15: 89 45 f8 mov %eax,-0x8(%ebp)
- 18: c6 45 f7 fe movb $0xfe,-0x9(%ebp)
- 1c: 8a 45 f7 mov -0x9(%ebp),%al
- 1f: 88 45 f6 mov %al,-0xa(%ebp)
- 22: 0f be 45 f7 movsbl -0x9(%ebp),%eax //int i=d; 符号扩展
- 26: 89 45 f0 mov %eax,-0x10(%ebp)
- 29: 0f b6 55 ff movzbl -0x1(%ebp),%edx //int j=a+d; 将a零扩展将d符号扩展
- 2d: 0f be 45 f7 movsbl -0x9(%ebp),%eax
- 31: 01 d0 add %edx,%eax
- 33: 89 45 ec mov %eax,-0x14(%ebp)
- 36: c7 45 e8 fd ff ff ff movl $0xfffffffd,-0x18(%ebp)
- 3d: c7 45 e4 01 01 00 00 movl $0x101,-0x1c(%ebp)
- 44: 8b 45 e8 mov -0x18(%ebp),%eax //m,m,p,q都是采用的截断操作
- 47: 88 45 e3 mov %al,-0x1d(%ebp)
- 4a: 8b 45 e4 mov -0x1c(%ebp),%eax
- 4d: 88 45 e2 mov %al,-0x1e(%ebp)
- 50: 8b 45 e8 mov -0x18(%ebp),%eax
- 53: 88 45 e1 mov %al,-0x1f(%ebp)
- 56: 8b 45 e4 mov -0x1c(%ebp),%eax
- 59: 88 45 e0 mov %al,-0x20(%ebp)
由代码可以看出,编译器在汇编后将所有数据都转化为补码二进制数据,所有类型信息都会消失,而底层硬件的操作对象都将是二进制补码数据。读取时将二进制数据以该类型的存储方式转换为相应的类型数据。在类型转换时采用截断、符号扩展以及零扩展的方式转换数据类型。
打印所有数据:
http://blog.csdn.net/tobacco5648/article/details/8245211