C语言-数据存储-整数

  • c语言中常见数据类型
int main(){
    printf("%d\n", sizeof(char)); // 1个字节
    printf("%d\n", sizeof(short)); // 2个字节
    printf("%d\n", sizeof(long)); // 4个字节
    printf("%d\n", sizeof(long long)); // 8个字节
    printf("%d\n", sizeof(float)); // 4个字节
    printf("%d\n", sizeof(double)); // 8个字节
    printf("%d\n", sizeof(long double)); //c99标准 16个字节
    return 0;
}

数据类型的意义在于表达数据在内存中占用空间大小,以及用用何种“眼光”去看待它。

  • 整数类型在内存中的存储
int main(){
int a = 10;
int b = -10;
return 0;
}

在c语言中,整数类型占4个字节,但这4个字节在内存中如何表示呢?在此引入 原码 反码 补码 概念。在内存中,所有数据均以二进制表示即“0” 和 “1”。整数又分为有符号数和无符号数,在无符号数中所有为都表示数值,因此原反补码都相同。对于有符号数,规定为最高位为符号位,“1” 表示负数,“0” 表示正数。负数的原码为符号位为1,其他位不变,反码为原码的符号位不变,其他位取反,补码=反码+1。对于整形而言,内存中存放的就是补码

为什么要引入补码?
因为在cpu中没有减法器,只有加法器,不能直接进行减法运算。
例如:

    // 计算 a - b
    int a = 1, b = 1;
    int c = a - b;
         a = 000000000 00000000 00000000 00000001

     -1原码 = 100000000 00000000 00000000 00000001
     -1反码 = 111111111 11111111 11111111 11111110
     -1补码 = 111111111 11111111 11111111 11111111
       加法 + 000000000 00000000 00000000 00000001
       结果 = 000000000 00000000 00000000 00000000 
      于是 a - b = a + (-b) = 1 + (-1) = 0
  • 大小端介绍
    大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
    小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

例如:设计一个小程序来判断当前机器的字节序。

int check_sys();
int main(){
    int a = 1;
    int ret = check_sys();
    if (ret == 1){
        printf("小端\n");
    }else{
        printf("大端\n");
    }
    return 0;
}

int check_sys(){
    int a = 1;
    char* p = (char*)&a;// 强制类型转换,取出第一个字节中的数
    // 如果是小端则返回1,大端则返回0
    return *p;
}

a为整形变量,定义一个字符类型的指针指向a,因为指针p的类型为字符指针类型,解引用之后只能访问一个字节内容,若第一个字节存放的是1,则表示 该整数在内存中存储方式为:低位保存在低地址中即为小端存储方式。(文章开始提到数据类型表示了在内存中占用空间大小)
补码运算举例

#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0;
}

%u 表示按无符号整形打印

   -128  10000000 
  整形提升后
  原码 10000000 00000000 00000000 10000000
  反码 11111111 11111111 11111111 01111111
  补码 11111111 11111111 11111111 10000000

本文参考比特鹏哥c语言教程

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值