剖析各类型和整数、浮点数在内存中的存储

来源:互联网 发布:饥荒联机mod知乎 编辑:程序博客网 时间:2024/05/17 05:58
**数据类型的介绍及有无符号型****内置类型**{整型unsigned/signed{  char ---1 short  ---2 int ---4 long --4/8字节}{ float --4 double --8long long --8long double --8例:![这里写图片描述](http://img.blog.csdn.net/20170726200221779?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR3VpanVuNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)例:char c = -1;本编译器默认为有符号形,内存中存入补码,一个字节为八个比特位,所以存入-1的低八个比特位为11111111。运算也为补码运算。存入时都以补码存入,区别为取出时,有符号数拿出原码,无符号数就直接拿出补码。![这里写图片描述](http://img.blog.csdn.net/20170726200348706?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR3VpanVuNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)**构造类型**数组类型数组元素的类型和数组元素的个数都是构成数组类型的一部分例int arr[5] ---sizeof(arr) ---20           ---sizeof(int [5]) ---20int arr[10] ---40char arr[5] ---5结构体类型 struct枚举类型 enum指针类型空类型:void表示空类型(无类型),通常用于函数的返回类型、函数的参数、指针类型。例:void test( void)---指不接受参数对与整型来说:数据存放内存中其实存放的是补码。**整型在内存中的储存**![这里写图片描述](http://img.blog.csdn.net/20170726200442812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR3VpanVuNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)例:写一个程序判断当前是大端存放还是小端存放做法1#include <stdio.h>#include <stdlib.h>int check_sys(){    int a = 1;    return *(char*)&a;//返回1表示小端,返回0表示大端}int main(){    //int a = 0;    //*(char*)&a;    int a = 1;    int ret = check_sys();    if (ret==1)    {        printf("小端字节序存储\n");    }    else if (ret==0)    {        printf("大端字节序存储\n");    }    system("lpause");    return 0;}做法2:联合成员共用同一块儿存储空间,联合的大小至少是最大成员的大小,但不一定是最大成员的大小。#include <stdio.h>#include <stdlib.h>int check_sys(){    union Un    {        char c;        int i;    } u;    u.i = 1;    return u.c;}int main(){    int ret = check_sys();    if (ret == 1)    {        printf("小端字节序存储\n");    }    if (ret == 0)    {        printf("大端字节序存储\n");    }    system("pause");    return 0;}参与运算的数,他们的大小如果没有达到整形的大小时,先进行整形提升,再进行运算,提升时补符号位。无符号数前面补零。(按%d和%u输出时,一定要整形提升)。#include <stdio.h>#include <stdlib.h>int main(){    char a[1000];    int i;    for (i = 0; i < 1000;i++)    {        a[i] = i - 1;    }    printf("%d\n", strlen(a));    system("pause");}输出结果为 1分析:strlen是求字符串长度,遇到\0就结束#include <stdio.h>#include <stdlib.h>int main(){    char a[1000];    int i;    for (i = 0; i < 1000;i++)    {        a[i] =  -1-i;    }    printf("%d\n", strlen(a));    system("pause");}输出结果为 255分析:从-1......-128127......10**浮点型在内存中的存储**常见的浮点数:3.141591E10 ---表示1.0*10^10浮点数家族:floatdoublelong double 类型浮点数的表示范围:float.h中定义1、IEEE(电气和电子工程协会)754:任意一个二进制浮点数v可以表示成下面的形式:(-1)^S*M*2*E(-1)^S表示符号位,当s=0,v为正数;当s=1,v为负数。M表示有效数字,大于1,小于22^E表示指数位。2、IEEE754规定:对于32位的浮点数,最高的一位是符号位S,接着的八位是指数E,剩下的23位为有效数字M。3、IEEE754对有效数字M和指数E,还有一些特殊的规定。前面说过,1<M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。统一将其1省略,只保存后面的xxxxxx部分,读取时再将第一位的1加上。至于指数E,情况就比较复杂:首先,E为一个无符号整数(unsigned int)这就意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。**E不为全0或全1**IEEE规定,存入内存的E的真实值必须加上一个中间数(为了解决指数是负数的情况),对于8位(单精度型)的E,这个中间数是127;对于11位(双精度double型)的E,这个中间数是1023.**E为全0**这时,浮点数的指数E等于1-127(或者1-1023)即为真实值有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0;以及接近与0的很小的数字。**E为全1**这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位S);
原创粉丝点击