整形数据在内存中的存储(C语言)

整形数据在内存中的存储

      • 1.整形家族
      • 2.(原码、反码、补码)基础知识
      • 3.大小端
        • 3.1 什么是大小端
        • 3.2 为什么有大端和小端
        • 3.3 一道关于大小端字节序的面试题
        • 3.4 关于整形数据存储的题目(7题)
          • 3.4.1
          • 3.4.2
          • 3.4.3
          • 3.4.4
          • 3.4.5
          • 3.4.6
          • 3.4.7
      • 4.总结

1.整形家族

signed可省可不省,一般省略不写unsigned charsigned charunsigned short [int]signed short [int]unsigned intsigned intunsigned long [int]signed long [int]

2.(原码、反码、补码)基础知识

计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。

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

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

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

int main()
{//为了方便表示,在vs中数据以十六进制呈现出来//0x0000000a  ->10int num = 10;//0xfffffff6  ->-10int num2 = -10;
}

在这里插入图片描述
我们可以看到对于num和num2分别存储的是补码。但是我们发现顺序有点不对劲。
这是又为什么?解下来介绍大小端

3.大小端

3.1 什么是大小端

大端(存储)模式:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处。
大端(存储)模式:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。

在这里插入图片描述

3.2 为什么有大端和小端

因为在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

3.3 一道关于大小端字节序的面试题

设计一个小程序来判断当前机器的字节序。

#include<stdio.h>
int check_sys1()
{int a = 1;return (*(char*)&a);
}
//方法2int check_sys2()
{union{int i;char c;}un;un.i = 1;return un.c;
}
int main()
{int ret = check_sys1();if (ret == 1)printf("小端字节序存储\n");elseprintf("大端字节序存储\n");printf("%d", ret);
}
3.4 关于整形数据存储的题目(7题)

原码 = 补码-1,然后取反
补充知识:原码 = 补码取反+1

3.4.1
int main()
{char a = -1;  //char是有符号字符类型,并且取值范围能存下-1,因此打印-1//10000000 00000000 00000000 00000001  原码//11111111 11111111 11111111 11111110  反码//11111111 11111111 11111111 11111111  补码//11111111 -a 截断(因为char只有1字节=8bit)//%d整形打印: 先提升,然后将补码转换成原码//11111111 11111111 11111111 11111111  补码//10000000 00000000 00000000 00000000  反码//10000000 00000000 00000000 00000001  原码 ->-1signed char b = -1; //char 和 signed char是一样的,知识char默认为有符号,所以省略了signed,结果也是-1//b同a一样unsigned char c = -1; //此时char是无符号//00000000 00000000 00000000 11111111  补码//11111111 -c 截断,因为是无符号,所以整形提升时前面补0//%d打印:需要发生整形提升//00000000 00000000 00000000 11111111 ->255printf("a=%d,b=%d,c=%d", a, b, c);return 0;
}
3.4.2
int main()
{char a = -128;//10000000 00000000 00000000 10000000  原码//11111111 11111111 11111111 01111111  反码//11111111 11111111 11111111 10000000  补码//10000000  ->-128//按%u: 无符号整形打印,需整形提升//11111111 11111111 11111111 10000000  ->4294967168printf("%u\n", a);return 0;
}
3.4.3

int main()
{char a = 128;//10000000 00000000 00000000 10000000   原码   ->整形提升//11111111 11111111 11111111 01111111   反码//11111111 11111111 11111111 10000000   补码//10000000  ->128//按%u: 无符号整形打印,需整形提升//11111111 11111111 11111111 10000000   ->4294967168printf("%u\n", a);return 0;
}
3.4.4
int main()
{int i = -20;//10000000 00000000 00000000 00010100//11111111 11111111 11111111 11101011//11111111 11111111 11111111 11101100   ->补码unsigned int j = 10;//00000000 00000000 00000000 00001010   ->补码//11111111 11111111 11111111 11101100 +//11111111 11111111 11111111 11110110   ->补码//10000000 00000000 00000000 00001001//10000000 00000000 00000000 00001010   ->10printf("%d\n", i + j);return 0;
}
3.4.5
#include<windows.h>
int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);Sleep(1);}return 0;
}

在这里插入图片描述

此结果是无限循环,因为i是无符号整形,i的值只可能大于等于0;

3.4.6
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}
//-1  -2  -3  -4....-128  127  126  125... 0
//-1  -2  -3  -4....-128  127  126  125... 0
//...

strlen遇到\0就结束,并且\0 == 0的,因此在第一次遇到0时就结束计算;
结果是:128+127=255, 不包括\0;

3.4.7
unsigned char i = 0;
int main()
{for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}

因为i是无符号字符型,并且i<=255,当i=255时,此时i++的结果是0,因此导致程序死循环;

4.总结

  1. 正数的原、反、补码都相同。
    负整数的三种表示方法各不相同。
  • 原码
    直接将数值按照正负数的形式翻译成二进制就可以得到原码。
  • 反码
    将原码的符号位不变,其他位依次按位取反就可以得到反码。
  • 补码
    反码+1就得到补码。
  1. 原码 = 补码-1,然后取反;
    补充知识:原码 = 补码取反+1;
  2. 对于整形来说:数据存放内存中其实存放的是补码。

大端(存储)模式:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处。
大端(存储)模式:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring创建的单例对象,存在线程安全问题吗?

这个问题涉及到Spring框架中的Bean的作用域、单例模式的线程安全性以及如何判断和处理线程安全问题。让我们一步步深入探讨这些概念。 Spring Bean的作用域 Spring提供了几种不同的Bean作用域&#xff0c;包括&#xff1a; 1、 Singleton&#xff08;单例&#xff09;&#x…

​​​​​​​Lontium #LT8911EXB适用于MIPIDSI/CSI转EDP应用方案,分辨率高达2560x1440@60HZ 。

1.描述 LT8911EXB是一款高性能 MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24bpp、YUV420 12bpp包&…

Kubernetes实战(十五)-Pod垂直自动伸缩VPA实战

1 介绍 VPA 全称 Vertical Pod Autoscaler&#xff0c;即垂直 Pod 自动扩缩容&#xff0c;它根据容器资源使用率自动设置 CPU 和 内存 的requests&#xff0c;从而允许在节点上进行适当的调度&#xff0c;以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器&…

C# HttpClient Get Post简单封装

文章目录 前言封装好的代码测试接口测试代码 前言 微软官方有Get和Post请求&#xff0c;我把他简单化处理一下 封装好的代码 public class MyHttpHelper{private string baseUrl;/// <summary>/// 基础Api/// </summary>public string BaseUrl{get{return baseUr…

还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~

相信很多使用 python 的小伙伴在工作中都遇到过&#xff0c;对数据进行相关编码或加密的需求&#xff0c;今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式&#xff0c;如何使用 python 去实现。话不多说&#xff0c;接下来直接进入主题&#xff1a; 前言 1…

EasyPOI导出报表

报表导出是一种很常见的功能&#xff0c;只要是开发都会涉及到这一功能&#xff0c;早些年经常集成poi完成导出功能&#xff0c;我之前也有写过关于poi导出的文章&#xff0c;现如今&#xff0c;也有了更为方便的导出插件 — EasyPOI&#xff0c;废话不多说&#xff0c;开始撸代…

【刷题篇】动态规划(八)

文章目录 1、分割回文串 IV2、分割回文串 II3、最长回文子序列4、让字符串成为回文串的最少插入次数5、最长公共子序列6、不相交的线 1、分割回文串 IV 给你一个字符串 s &#xff0c;如果可以将它分割成三个 非空 回文子字符串&#xff0c;那么返回 true &#xff0c;否则返回…

浅述热点方向-具身智能

具身智能 1. 具身智能&#xff08;Embodied AI&#xff09;概述 人工智能、机器学习和计算机视觉的最新研究趋势催生了一个不断增长的研究领域&#xff0c;称为“具身智能”。Facebook 人工智能研究中心 (FAIR) 和英特尔实验室一直在引领嵌入式人工智能领域的新项目。“体现”…

2024阿里云服务器ECS实例全方位介绍_优缺点大全

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网aliyu…

安卓多用户管理之adb指令

前言 有一些与多用户相关的adb 指令可以更好地帮助我们了解和调试安卓多用户相关信息 一、多用户adb指令 查看用户列表   adb shell pm list users 查看用户信息&#xff1a; adb shell dumpsys user 创建新用户   adb shell pm create-user [–profileOf userId] [–mana…

常用服务器管理面板整理汇总

服务器管理面板是用于管理和控制服务器的软件&#xff0c;可以帮助管理员更轻松地进行服务器管理和维护。以下是几种常用的服务器管理面板&#xff1a; 1、宝塔面板【官网直达】 宝塔面板是一款服务器运维管理软件&#xff0c;支持Windows和Linux等操作系统&#xff0c;提供了…

three.js实现渐变墙效果(电子围栏)

three.js实现渐变墙效果&#xff08;电子围栏&#xff09; 图例 步骤 两个平面几何体&#xff0c;添加纹理贴图平移纹理贴图 代码 <template><div class"app"><div ref"canvesRef" class"canvas-wrap"></div></d…

【uniapp】遇到的一些问题

一、小程序中textarea ios样式不生效的方法 默认有内边距&#xff0c;加个disable-default-padding"true" 二、uni-data-picker循环使用&#xff0c;一个改了全局的值 换成了uni自带的picker&#xff0c;下面括号里必须有默认值&#xff0c;为空字符串的时候&…

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统&#xff0c;我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中&#xff0c;我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据&#xff0c;并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…

认识Linux指令 “zip/unzip” 指令

01.zip/unzip指令 语法&#xff1a; zip 压缩文件.zip 目录或文件 功能&#xff1a; 将目录或文件压缩成zip格式 常用选项&#xff1a; -r 递归处理&#xff0c;将指定目录下的所有文件和子目录一并处理 举例 将test2目录压缩&#xff1a;zip test2.zip test2/* 解压到…

代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…

什么是预训练Pre-training—— AIGC必备知识点,您get了吗?

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 随着人工智能(AI)不断重塑我们的世界&#xff0c;其发展的一个关键方面已经…

springboot医院信管系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

浙大恩特客户资源管理系统 CrmBasicAction.entcrm任意文件上传

产品介绍 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升销售和市场营销的效果。 漏洞描述 浙大恩特客户资源管理系统 fcrmbasicaction接口存在任意文件上传漏洞。攻击者可通过该漏洞在服务器…