首页 > 系统相关 >整数在内存中的存储(含整型提升的详解)

整数在内存中的存储(含整型提升的详解)

时间:2024-09-08 19:49:46浏览次数:13  
标签:符号 补码 提升 char 详解 整型 CPU 内存

整数在内存中的存储

整数的2进制表示法有三种,即:原码、反码和补码
有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的⼀位是被当做符号位,剩余的都是数值位。

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


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

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?

在计算机系统中,数值⼀律用补码来表示和存储。
原因在于,使用补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

整型提升

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升

 整型提升的意义

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

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


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

例如:

char a,b,c;
...
a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算。


加法运算完成之后,结果将被截断,然后再存储于a中。

 如何进行整体提升呢?

1. 有符号整数提升是按照变量的数据类型的符号位来提升的
2. 无符号整数提升,高位补0

解释如下: 

char c1 = -1;

变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//⽆符号整形提升,⾼位补0

整形提升的实例

#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;
}

解析如下:

笔者水平有限,不足之处还请各位大佬多指教。

标签:符号,补码,提升,char,详解,整型,CPU,内存
From: https://blog.csdn.net/2301_82213854/article/details/142031490

相关文章

  • Kubernetes Pod四种常见调度策略详解
    在Kubernetes(k8s)的世界里,Pod是最基本的部署单元,它可能包含一个或多个容器。如何将这些Pod调度到集群中的适当节点上,是一个至关重要的问题。Kubernetes提供了多种调度策略,以确保Pods能够高效、稳定地运行。本文将详细介绍四种常见的KubernetesPod调度方式。1.默认调度默认调度......
  • C语言的动态内存管理
    ......
  • 网络协议详解
    目录1.认识网络协议2网络协议的设计2.1网络通信的问题2.2网络协议的分层设计软件分层与网络分层3.OSI七层网络模型各层次的介绍如下4.TCP/IP五层协议各层次说明各层次所解决的问题5.网络和操作系统之间的关系单主机下多主机下6.重新理解网络协议1.认识网络协......
  • Spring Boot 整合 RabbitMQ 详解
    前言:在消息中间件领域中RabbitMQ也是一种非常常见的消息中间件了,本篇简单分享一下SpringBoot项目集成RabbitMQ的过程。RabbitMQ系列文章传送门RabbitMQ的介绍及核心概念讲解@RabbitListener注解详解SpringBoot集成RabbitMQ可以分为三大步,如下:在proerti......
  • 基于yolov10的行人跌倒检测系统,支持图像检测,也支持视频和摄像实时检测(pytorch框架)【py
       更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于yolov10的行人跌倒检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的行人跌倒检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训......
  • 一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式
    一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式1RISC-V的寻址方式计算机常用的寻址方式有3种:1.1立即数寻址指令中直接给出相应的操作数(立即数),比如RISC-V中的短立即数指令,因为操作码直接包含立即数中,所以立即数寻址对立即数的大小有限制,在RV32I指令集中,立即数一共12位......
  • Sora原理详解
    重磅推荐专栏:《大模型AIGC》《课程大纲》《知识星球》本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和StableDiffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验......
  • STM32 PWM 详解(基于 STM32F429 HAL 库)
    目录前言一、PWM简介二、STM32F429的PWM功能1.定时器资源2.PWM模式3.PWM原理图三、使用HAL库配置STM32F429的PWM1.开启时钟2.配置定时器3.配置通道 4.启动定时器 5.PWM占空比的调节 四、应用实例五、总结前言        在嵌入式系统开......
  • Linux系统性能调优详解
    前言在服务器运维和管理中,Linux系统的性能调优是确保服务稳定性和响应速度的关键。通过对系统进行细致的调优,可以显著提升处理能力,优化资源利用率。本文将详细介绍Linux性能调优的多个方面,包括系统监控、磁盘优化、内存管理、网络配置等,并提供实用的技巧和工具。简介Linu......
  • C语言入门:回调函数与递归函数详解
    对于刚刚接触C语言的同学来说,回调函数和递归函数可能听起来有些复杂,但它们是编程中非常有用的工具。在这篇文章中,我将接着上一篇文章详细介绍这两个概念,并通过简单易懂的例子,让你轻松理解它们的作用和使用场景。废话不多说,我们开始吧~1.什么是回调函数?回调函数的概念回......