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

**数据类型的介绍及有无符号型**
**内置类型**
{整型
unsigned/signed
{
  char ---1
 short  ---2
 int ---4
 long --4/8字节
}
{
 float --4
 double --8
long long --8
long 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]) ---20
int arr[10] ---40
char 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.14159
1E10 ---表示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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值