(入门自用)C语言 数据存储 (无浮点数)

1.类型

整形型有:cha int short long

其中char虽然是字符类型,但字符类型存储的时候存的是字符的ascii码值,是整数。

signed char c1//不一定等价于short              signed short c1//有符号的 等价于short /...

unsigned char c2                                          unsigned short c2//无符号的 /..

如果是有符号的数据,最高位是符号位。0是正数,1是负数。

char大部分编译器默认为正数。

浮点型:flout doublle

构造类型:数组类型、构造体类型、枚举类型、联合类型。

指针类型:int* char* flout* void* /..

空类型: void

2.整型在内存中的存储

2.1原码、反码、补码

正整数三码相同。对于整型而言内存中存储的是补码

int a=10 原码 00000000 00000000 00000000 00001010   

              反码 00000000 00000000 00000000 00001010   

              补码 00000000 00000000 00000000 00001010   

  b=-10 原码   10000000 00000000 00000000 00001010  

            反码    11111111 11111111 11111111       11110101  符号位不变,其他位按位取反

            补码    11111111 11111111 11111111       11110110  反码+1

16进制中 1111 代表f 所以b的地址0xff ff ff f6(内存中是大端存储)

2.2数据范围

有符号char数据大小范围(-128~127) 无符号(0~255)

有符号short数据大小范围(-32768~32767)无符号(0~65535)

//...

%u ->按照无符号数打印,不是无符号数也认为是无符号数

%d-> 按照有符号数打印。

3.大小端存储

int a=0x11223343;

       高位          低位

大端存储:把高位字节处的数据放在低地址处,把低位字节处放在高地址处

小端存储:把低位字节处的数据放在低地址处,把高位字节处放在高地址处

低地址高地址
大端:11 22

33  43   

小端:43 3322  11

VS系统中用的是小端存储

char*类型指针只能访问一个字节,如果1是小端存储,访问的字节刚好是01,*p如果是1就表明是小端存储

int check_sys()
{
    int a=1;
    return *(char*)&a;
}

整型提升

 -1的原码 10000000 00000000 00000000 00000001
  补码为   11111111 11111111 11111111 11111111
   由于a为char类型 所以存的是 11111111
   a发生整型提升 补符号位得到补码为 11111111 11111111 11111111 11111111
   整型提升后 补码变原码为 -1
   unsigned char b=-1;
    b存的是1111 1111
   无符号数整型提升补0
    b为 00000000 00000000 00000000 11111111
    按照有符号数打印原码和补码一样 为255

int main()
{
    char a=-1;
    //-1的原码 10000000 00000000 00000000 00000001
    //补码为   11111111 11111111 11111111 11111111
    //由于a为char类型 所以存的是 11111111
    //a发生整型提升 补符号位得到补码为 11111111 11111111 11111111 11111111
    //整型提升后 补码变原码为 -1
    unsigned char b=-1;
    //b存的是1111 1111
    //无符号数整型提升补0
    //b为 00000000 00000000 00000000 11111111
    //按照有符号数打印原码和补码一样 为255
    

    printf("a=%d,b=%d",a,b);
    //当打印a时,a不够一个整型 发生整型提升
    return 0;
}

截断

char a =128; // 00000000 00000000 00000000 10000000

//存不下发生截断 存的是1000 0000

//整型提升 由于char是有符号数 11111111 11111111 11111111 1000 0000

//按照%u打印 认为没有符号位 是一个大数

printf("%u ",a);

例题

int main()
{
    char a[1000];
    for(i=0;i<1000;i++)
    {
        a[i]=-1-i;
    }
    printf("%d ",strlen(a));
    //统计\0之前出现多少个字符
    return 0;
}

理论上字符串里面存的是-1到-1000

但char的范围为(-128~127)

达到-128时,再减1由于char类型发生截断被解析变成了127

所以存到的是-1、-2...-128、127、126...2、1。

所以有255个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值