C语言数据存储--整型

整型数据:

整型家族

char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long

原码、反码、补码

1、正整数原码、反码、补码相同,直接进行二进制转换就可;(2^32-1个正整数)
2、负整数32位的首位为符号位(1代表负数);(2^31-1个符数)
原码将剩余的31位通过负整数的绝对值进行二进制转化
反码是符号位不变,其余位数取反
补码是反码+1
3、0是一个特殊的数,由于符号位存在,分为+0,-0;
+0 为00000000000000000000000000000000
-0 为10000000000000000000000000000000

减法计算

我们知道计算机的CPU是不能处理减法的,于是对10-20,计算机处理成10+(-20)

int main(){
    int a = 10; //00000000000000000000000000001010 (1)原反补相同
    int b = -20;//10000000000000000000000000010100 原码
                //11111111111111111111111111101011 反码 
                //11111111111111111111111111101100 补码(2)
                //11111111111111111111111111110110 (1)+(2) 补码
                //11111111111111111111111111110101 反码
                //10000000000000000000000000001010 原码 -->-10
    return 0;
}

计算机的大小端

何为大小端?

在这里插入图片描述

在这里插入图片描述

如何判断计算机是大端还是小端?

int check_sys(){
    int a = 1;//0x00 00 00 01
    char *p = (char *)&a;//char *类型只能存储1个字节
    return *p;//若是小端则存储01(低地址存储低字节) 大端则存储00 (低地址存储高字节)
}
int main(){
    if(check_sys()==1){
        printf("小端\n");
    }else
    {
        printf("大端\n");
    }
    return 0;
}

一些操作实例

1、

//输出什么?
#include <stdio.h>
int main(){
    char a = -1;//10000000000000000000000000000001 原码
                //11111111111111111111111111111110 反码
                //11111111111111111111111111111111 补码
                //实际只能保存11111111
                //11111111111111111111111111111111 整型提升 补码
                //11111111111111111111111111111110 反码
                //10000000000000000000000000000001 原码

    signed char b = -1;//和上个例子一样
    unsigned char c = -1;//注意到无符号 则整型提升时00000000000000000000000011111111 补码=反码=原码
    printf("%d %d %d", a, b, c);
}

2、

int main(){
    char a = 128;
    printf("%u", a);
    //10000000000000000000000010000000-- 128
    //10000000 a
    //11111111111111111111111110000000 --整型提升
    //由于无符号 直接转化成为十进制 4294967168
    return 0;
}
int main()
{
    char a = -128;//与上一个主函数其实没有区别
    printf("%u\n",a);
    return 0; }

3、

int main(){
    int i = -20;
    //10000000000000000000000000010100原码
    //11111111111111111111111111101011反码
    //11111111111111111111111111101100补码
    unsigned int j = 10;
    //00000000000000000000000000001010原码
    //11111111111111111111111111110110和 补码
    //11111111111111111111111111110101反码
    //10000000000000000000000000001010原码
    printf("%d\n", i + j);
}

4、

int main(){
    unsigned int i;
    for (i = 9; i >= 0;i--){
        printf("%u\n", i);
        Sleep(1000);
    }
    //10000000000000000000000000000001(-1)
    //11111111111111111111111111111110
    //11111111111111111111111111111111
    //11111111 &i
    //11111111111111111111111111111111(极大数)由于无符号整型所以死循环
    return 0;
}

5、

int main(){
    char a[1000];//char 类型储存数据只能从-128->127
    int i;
    for (i = 0; i < 1000;i++){
        a[i] = -1 - i;
    }
    printf("%d", strlen(a));//答案255
    return 0;
    //-1--> 整型提升-->-1
    //-2--> 整型提升-->-2
    //......
    //-127-->整型提升-->-127
    //-128-->整型提升-->-128
    //-129-->整型提升-->127
    //-130-->整型提升-->126
    //......
    //-255-->整型提升-->1
    //-256-->整形日升-->0-->strlen结束标志
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值