C语言:数据在内存中的存储

本文详细探讨了整数(原码、反码、补码及截断)在内存中的存储方式,介绍了整型提升的概念,区分了大端和小端字节序,并通过示例解析浮点数的IEEE754存储格式,讨论了浮点数存储精度问题和比较的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.整数在内存中的存储

整数的二进制表示方法有三种,即原码、反码和补码

三种表示方法均有符号位和数值位两部分,符号位都是用0表示‘正’,用1表示’负‘,而数值位最高位的一位是被当作符号位,剩余的都是数值位

正整数的原、反、补码都相同

负整数的三种表示方法各不相同

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码

补码:反码+1就得到补码

对于整数来讲,数据存放内存中其实存放的是补码.

1.1截断

什么是截断?

截断(Truncation)是指将一个较大的数据类型转换为较小的数据类型时,丢弃高位字节或位的过程。

当将一个较大的数据类型转换为较小的数据类型时,可能会发生截断。截断意味着丢弃较大数据类型的高位字节或位,只保留较小数据类型所能表示的范围内的值。这可能导致数据的精度丢失或溢出。

例如,将一个32位整数(4个字节)转换为16位整数(2个字节)时,会丢弃高16位字节,只保留低16位字节。这就是截断。  int->short即会发生截断

1.2整型提升

什么是整型提升?

C语⾔中,整型算术运算总是⾄少以缺省(缺省就是默认的意思)整型类型的精度来进⾏的。

为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升

1.2.1意义

 表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。

     因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。

     通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算。

      也就是说,假设c1和c2是char类型,那么要先将要实现c1+c2,就需要对c1和c1进行整型提升之后进行运算,那么假设我们用char类型的c3去接收c1和c2的结果,由于char类型是一个字节,所以会发生截断。截断之后,只会保留低位的字节存储在c3中!!

1.2.2如何进行整型提升

1. 有符号整数提升是按照变量的数据类型的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值