计算机底层数据的处理方式

    编程语言是怎么实现类型转换的,而计算机底层又是怎样处理各种类型数据的呢,好吧,源码说明一切。

    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)

    由代码可以看出,编译器在汇编后将所有数据都转化为补码二进制数据,所有类型信息都会消失,而底层硬件的操作对象都将是二进制补码数据。读取时将二进制数据以该类型的存储方式转换为相应的类型数据。在类型转换时采用截断、符号扩展以及零扩展的方式转换数据类型。



打印所有数据:




你可能感兴趣的:(C)