剖析整数,浮点数在内存中的存储

来源:互联网 发布:mac flamingo多少钱 编辑:程序博客网 时间:2024/06/05 00:54

 

整数主要分为 unsigned int 和 signed int  

但是 char类型较为特殊 char类型分为 char类型本身和unsigned char类型和signed char,char的类型主要取决于编译器,有的编译器把char当做unsigned char,有的编译器则将其当做signed int类型。

大端存储:将数据的低位存放到内存的高地址处,将数据的高位存放到内存的低地址处。

小端存储:将数据的低位存放到内存的低地址处,将数据的高位存放到内存的高地址处。

#include<stdio.h>

int main()

{ char a = -1;

signed char b = -1;

unsigned char c = -1;

printf("%d%d%d",a,b,c)

return 0;

}

输出结果:-1,-1,255

#include <stdio.h>

int main()

{

char a = -128;分析:在内存中-128,存储为

printf("%u\n",a);10000000 因为char 在vs2008中是signed char 故变成 

return 0; 11111111 1111111111111111     10000000

}

输出结果:4294967168


#include<stdio.h>

int main()

{ char a = 128;11111111 11111111 11111111 10000000

printf("%u\n",a);

return 0;

}  输出结果:4294967168 整型提升提升char ,%u则是以%u的角度来看问题


#include <stdio.h>

int main()

{ int i = -20;-20 原码:10000000 00000000 00000000 0001010010:00000000 00000000 00000000 00001010

unsigned int j = 10;反码:11111111 11111111 11111111 11101011二者相加:11111111 11111111 11111111 11110110

printf ("%d\n",i+j);补码:11111111 11111111 11111111 11101100减一:11111111 11111111 11111111 11110101

return 0; 取反:10000000 00000000 00000000 00001010

}  结果是-10:


#include <stdio.h>

int main()

{ int unsined i;此题基本是无限循环,因为到了-1,-1其实你是 用size-t 的角度来看的话

for (i=9; i>=0; i--)他其实是一个特别大的数字 ,基本还是无限循环。

{

printf("%u\n",i);

}

return 0;

}



#include<stdio.h>

int main()

{

short num = 32767;这个其实跟 signed int 是128 那个基本相同

short int a = num +1;还是加一 整型提升成一个 十分大的数字

printf("%d",a);

}

#include <stdio.h>


int main()
{
unsigned char i = 0;
for (i = 0; i<=255; i++)
{ 11111111
puts("hehe\n");+  00000001
} 100000000
return 0;
} 255+1  其实在char中先加一  进一位 后面全是零 但是因为是char 故又只要后面 8位 所以 i又变成0了   无限死循环











浮点数在内存中的存取:

在IEEE 754 中 规定:对于32位的浮点数,最高位的1位是符号位S,接着的8位是指数E,剩下的23位是有效数字M。


对于64位的浮点数,最高位的1位是符号位S,接着的11位是指数E,剩下的52位是有效数字M。



    #include <stdio.h>


int main()
{
int num = 9;
float *pfloat = (float *)&num;
printf("num=%d\n",num);
printf("*pfloat = %f\n",*pfloat);


*pfloat = 9.0;
printf("num =%d\n", num);
printf("*pFloat= %f\n",*pfloat);




return 0;
}          出现这种结果 就是因为浮点数跟整数在内存中的存储方式不同

第一个  num的结果是9,这当然毋庸置疑,其次*pfloat 的值: 9 在内存中表示 00000000 00000000 00000000 00001001

如果用float的角度来看  第一位符号位 中间8位 是E 直接 E全零 就认为是0了 后面都不管

第四个是9.0 毋庸置疑  第三个:是用浮点数的角度创建的9.0 但是解析的时候是用 int 解析的 自然有问题

9.0  浮点数 符号位是0 ,然后二进制 是1001.0    1.001*2^3  s=0; M= 1.001; E=3;

e= 127+3= 130;  10000010

0 10000010 001 00000000000000000000  然后按照int的角度来看就是一个 很大的正数