数据的存储

很久以前的笔记,如果学的比较透了再来补充

数据类型字节数
char1
short2
int4
long8
long long8
float4
double8

char虽然是字符类型,但是字符存储的时候, 存的是字符的ascii码值,是整数,所以char也是整形家族的

cpu只有加法器

一、整形提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的char和short型操作数在使用之前被转换为int,这种转换称为整型 提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

整型提升的例子:

//例一
#include<stdio.h>
int main()
{
  //首先把整型数据赋值给char型变量,会发生操作数截断
  //而当有操作符作用在数据上时,数据又会整型提升
    char a = 3;
    //00000000 00000000 00000000 00000011 —— 原码、反码、补码
    //00000011 —— 截断之后的储存存值 —— 补码
    
    char b = 127;
    //00000000 00000000 00000000 01111111 —— 原码、反码、补码
    //01111111 —— 截断
    
    char c = a + b;
    //00000000000000000000000000000011 —— a整型提升之后 —— 可进行运算
  	//00000000000000000000000001111111 —— b整型提升之后
    //00000000000000000000000010000010 —— 运算之后
    //10000010 —— 截断之后
    //11111111111111111111111110000010 —— 整型提升 —— 补码
    //11111111111111111111111110000001 —— 反码
    //10000000000000000000000001111110 —— 原码 —— -126
    printf("%d\n", c);  //打印值为-126
    return 0;
}
//例二
int main()
{
    char a = 0xb6;
    short b = 0xb600;
    int c = 0xb6000000;
    if(a==0xb6)
        printf("a");
    if(b==0xb600)
        printf("b");
    if(c==0xb6000000)
        printf("c");
    return 0;
}
答案为:c
解析:
变量a为字符类型 —— 需要进行整型提升 —— a为10110110  —— 最高位为符号位(1)
—— 整型提升之后 —— 11111111111111111111111110110110 —— 整型提升之后不等于原值
变量b同理 —— 整型提升之后不等于原值
变量c为整型 —— 不需要进行整型提升 —— 等于原值。

//例三
int main()
{
 char c = 1;
 printf("%u\n", sizeof(c));
 printf("%u\n", sizeof(+c));
 printf("%u\n", sizeof(-c));
 return 0;
}
答案为:1   4   4
分析:
第一个:c为char类型的变量,所以大小为1个字节
第二个:+ 为运算操作符 —— 如果运算就需要进行整型提升 —— 整型提升到int类型 —— 大小为4字节
第三个;和第二个同理

二、算术转换

整型提升是int类型大小以下以及int类型运算类型的转换

算数转换是int类型大小以上的运算的转换

即向上转换

在这里插入图片描述

三、浮点数在内存中的存储

32位浮点数和64位浮点数在内存中存储的格式:

在这里插入图片描述

S:符号位。0表示为正数,1表示为负数
E:阶码。它的值等于浮点数的指数e加上一个修正数(127(32位下)/1023(64位下)
M:尾数。

在IEEE754标准中,一个规格化的32位浮点数x的真值表示为:

x = ( − 1 ) S ∗ ( 1. M ) ∗ 2 E , E = e + 127 x = (-1)^S*(1.M)*2^E, E = e+127 x=(1)S(1.M)2E,E=e+127

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值