C语言——整型、浮点型数据存储(1)

 1数据类型介绍:
 前面我们已经学习了基本的内置类型
 char short int long longlong float double
 字符数据型短整型整型长整型更长的整型单精度浮点数双精度浮点数
 有了丰富的类型我们可以更加灵活的使用
 类型的意义:
 使用不同类型改变开辟内存空间的大小
 丰富我们如何看待内存空间的视角
 
 1.1类型的基本归类:
 整型家族: 
 char  unsigned char   signed char  
 char 类型虽然是字符类型,但是字符类型存储的时候,存储的字符的ascii码值
 ASCII码值是整数,所以char类型是整型
 
 short unsinged short[int]     signed short[int]   
       无符号的短整型           有符号的短整型
 short s1;//有符号的
 相等于 signed short s2;//有符号的
 我们如果想表示有正负的数据例如温度,可以粗放在有符号的变量中
 年龄:只有正数的数据 可以存放在无符号的变量当中
 有符号,无符号那么该如何理解?
 short -2个byte--16bit
 0000000000000000
 一个二进制序列 : 如果是有符号的数据,最高位是符号位
 最高位是0,表示正数
 最高位是1,表示负数
 对于无符号数来说,最高位也是数据位
 int 类型 int相当于signed int 
 unsigned int 需要单独说明
 long 类型 long相当于signed long 
 char类型比较特殊,C语言没有规定char 是signed char 还是unsigned char
 这个完全取决于编译器,大部分char 还是signed char


 浮点型家族:
 float
 double
 当然也还有long double 这种类型



 
 构造类型家族(自定义类型)
 数组类型 int [x];x可以自定义
 int 也是任意的,可以改成其他类型char short..
 结构体类型struct
 枚举类型enum
 联合类型union
 指针类型家族:
 指针变量是用来存放地址的
 当然呢,不同的指针类型代表的意义也有所差异

空类型/无类型:
 void (空)
void test(void)         //(void)意思不需要传参
{
    ;
}


 整型在内存中的存储:
  形式有 原码反码补码:

int main()
{
    //整数可以写出三种2进制的表示形式
    int a = 10;//整型值
    //原码:直接翻译成2进制数
    //000000000000000000000000000001010
    //正数整型的反码和原码一样
    //000000000000000000000000000001010
    //正数整形的补码和原码一样
    //000000000000000000000000000001010
    int b = -10;//整型值
    //负数的表示方式不同
    //原码
    //10000000000000000000000000001010
    //反码:符号位不变,其他位按位取反
    //11111111111111111111111111110101
    //补码:反码+1
    //11111111111111111111111111110110
    // 
    //内存中存放的都是补码
    //   1111 1111 1111 1111 1111 1111 1111 0110
    //0x F      F   F     F    F    F   F     6
    //0xFFFFFFF6
    //我看了是一样的,不是摆拍,要倒着看4位(从右往左看每1位),顺着(从左往右)读2个数
    //
    return 0;
}


 2进制
 8进制
 10进制
 16进制
 不同的进制,只是数据的表示形式:
 数字:
 50----10进制
 对应
 32----16进制
 对应
 62-8进制
 进制说明:
 2进制 0~1
 8进制 0~7
 10进制0~9
 16进制0~9 a~f
 
 为什么数据在内存中存储的是补码?
 
 举个例子

int main()
{
    计算1-1
    CPU只会加法
    1-1=1+(-1);
00000000000000000000000000000001 原码
10000000000000000000000000000001 原码
10000000000000000000000000000010 用原码计算是错误的
使用补码的方式:
00000000000000000000000000000001 原码
11111111111111111111111111111111 补码(反码+1)
100000000000000000000000000000000  最前面那个1 放不下了,然后就是0啦
00000000000000000000000000000000  实际情况,丢高位,留低位
    return 0;
}


假设我们是char字节
 1byte  8bit
 00000000
 ~
 01111111  127最大正值
 ~
 10000000   直接解析为-128
 ~
 11111110-->10000010 原码 值为-2
 11111111-->10000001 原码 值为-1
 那么signed char 的值的取值范围就已知了,是-128~127
 如果是unsigned char  0~255  256个数字!

int main()
{

    unsigned int ch = -10;
    printf("%u\n", ch);//%u打印无符号数,不是无符号数,也认为是无符号数
    printf("%d\n", ch);//打印有符号数,不是有符号,也认为是有符号
    return 0;
//100000000000000000000000000000001010
//111111111111111111111111111111110101
//111111111111111111111111111111110110 补码形式 因为无符号 结果为一个正数
}


 short数据类型
 short --signed short
 2byte
 16bit
0000000000000000
 ~
0111111111111111  32767
1000000000000000   直接被解析为-32768
 ~
1111111111111110    -2
1111111111111111    -1
 
 如果是unsigned short
0000000000000000  0
 ~
1111111111111111  65535
 
int main()
{
    int a = 0x11223344;
    //通过调试后
    //窗口 内存查看存放的数据
    //可以看到是倒着放的
    return 0;
}

/新知识点: 大小端字节序存储
 大端字节序存储:
 小端字节序存储:
大端字节序存储:  把一个数据的低位字节处的数据存放在高地址处
                 把高位字节处的数据存放在低地址处
 小端字节序存储: 把一个数据的地位字节处的数据存放在低地址处
                 把高位字节处于的数据存放在高地址处
    VS使用的是小端
 出现这个东西的原因:
在计算机系统中,我们以字节为单位, 每个地址单元都对应着一个字节,一个字节为8bit
 对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节
 那么必然存在着一个如何将多个字节安排的问题。
 因此就出现了大端存储和小端存储模式的区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值