关于C的那些事01篇-数据存储

目录

一、数据类型 

二、原码 反码 补码

三、大小端

四、整型提升与隐式类型转换

五、浮点数存储


一、数据类型 

 

类型(整型)字节类型(浮点数)
char1double8
short2float4
long4
int4
long long8

 void是空类型,不能确定长度,不能直接定义变量,但是void*可以

%4.3lf表示输出4个数字,小数点后3位

二、原码 反码 补码

正数的原、反、补码相同

反码:原码符号位不变,按位取反

补码:反码+1

从补码到原码:(1)逆向计算(2)重新执行原码到补码的过程

数值一律用补码表示和存储

三、大小端

大端存储:数据的低位保存在高地址中,高位在低地址中

小端存储:数据的低位保存在低地址中,高位在高地址中

四、整型提升与隐式类型转换

整型提升:对于所有比int小的类型(char,signed char,unsigned char,short,unsigned short)会先提升为int,按照变量的符号,高位补符号位,无符号变量则补0

隐式类型转换

(1)算术转换

运算时,以表达式中最长的类型为主进行转换

(2)赋值转换

右边数据类型长度大于左边,则进行截断

(3)输出转换

输出的数据与输出格式不符,会自动进行类型转换

#include <stdio.h>
int main()
{
    char a= -1;
    signed char b=-1;
    unsigned char c=-1;
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0; 
}

上述代码,会发生整型提升,a,b是有符号char类型,以int型输出先转为原码1111...1111->1000....1->-1;c是无符号char类型,0000....1111 1111->255.所以结果是a=-1,b=-1,c=255

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

上述代码,128的二进制是1000....1000 0000,存入a中为1000 0000,以无符号整型输出,发生整型提升,高位补1,为1111....1000 0000,输出是一个较大的数4294967168

int i= -20;
unsigned  int  j = 10;
printf("%d\n",i+j);

上述代码输出仍为-10,底层运算时,两个整数的任何类型进行计算都是两个二进制进行计算

tips:char的取值范围是[-128,127],-128在存储时转为补码1 1000 0000,char类型只有8个比特位所以-128存进去是1000 0000,所以1000 0000用来表示-128补码而不是-0

五、浮点数存储

浮点数存储先转为二进制后以标准形式存储,存入S、E、M

(-1)^S*M*2^E

其中(-1)^S表示符号位,(S=0,为正数;S=1,为负数);

M表示有效数字,2>M≥1;占23位

2^E表示指数位,占8位

对于double型,E为8位,要加中间数127;对于float型,E为11位,中间数是1023

例如:a=9.0存储时,9.0转为二进制是1001.0,即(-1)^0*1.001*2^3,S=0,E=127+3=130,M=1.001,存储M时保留小数点后的,所以a存储时会是0 1000 0010 0010 0000....

如果化为上述形式后E不全为0或1,则可以倒推到原来的数字;E全为0,则有效数字M不加1,而是还原成0.xxxxxx的小数;E全为1,M全为0,表示无穷大

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值