整形数据在内存中的存储(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 char
 signed char
 
 unsigned short [int]
 signed short [int]

 unsigned int
 signed int

 unsigned long [int]
 signed long [int]

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

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

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

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

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

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

int 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");
	else
		printf("大端字节序存储\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  原码 ->-1
	
	signed 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 ->255
	
	printf("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  ->4294967168
	printf("%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   ->4294967168
	printf("%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   ->10
	printf("%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. 对于整形来说:数据存放内存中其实存放的是补码。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尝试OmniverseFarm的最基础操作

目标 尝试OmniverseFarm的最基础操作。本地机器作为Queue和Agent&#xff0c;同时在本地提交任务。 主要参考了官方文档&#xff1a; Farm Queue — Omniverse Farm latest documentation Farm Agent — Omniverse Farm latest documentation Farm Examples — Omniverse Far…

蜗牛目标检测数据集VOC格式480张

蜗牛&#xff0c;一种缓慢而坚韧的软体动物&#xff0c;以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形&#xff0c;有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异&#xff0c;有的光滑如玻璃&#xff0c;有的则布满细纹。蜗牛的头部有两对触角…

构建安全可靠的系统:第十一章到第十五章

第三部分&#xff1a;实现系统 原文&#xff1a;Part III. Implementing Systems 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一旦您分析并设计了您的系统&#xff0c;就该是实现计划的时候了。在某些情况下&#xff0c;实现可能意味着购买现成的解决方案。第十一章…

【AI】CycleGan对抗生成网络遥感影像生成地图效果测试

今天看到一个有趣的项目&#xff0c;CycleGan对抗生成网络把马生成成斑马&#xff0c;还有一个测试用例是用遥感影像生成平面地图的效果&#xff0c;效果如下图所示&#xff0c;我大学是遥感专业&#xff0c;看到遥感影像就触动了我的原神&#xff0c;于是原神启动&#xff0c;…

JavaFx踩坑

github&#xff1a;https://gitee.com/forgot940629/java-fx-demo helloworld 直接用idea即可创建 MANIFEST.MF 没有MANIFEST.MF 直接用idea生成的JavaFX没有MANIFEST.MF这个文件&#xff0c;需要配置 jar包中MANIFEST.MF不一致 target文件中的MANIFEST.MF有Main-Clas…

Beauty algorithm(七)瘦脸

瘦脸的实现采用局部平移法。 一、skills 前瞻 局部平移 二、目标区域定位 左脸: 关键点选择3、5点,基点30 rmax:计算两点5-3间的距离, |x-c|:图像任一点到固定基点c的距离 |m-c|:两固定点距离 右脸: 关键点选择

2024-01-01 K 次取反后最大化的数组和和加油站以及根据身高重建队列

1005. K 次取反后最大化的数组和 思路&#xff1a;每一次取反最小值即可&#xff01;贪心的思路就是先排序&#xff0c;反转负数的值&#xff0c;后在贪心反转最小值 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:count 0while …

C++ 给父类带参构造函数的赋值

在类的使用中&#xff0c;默认的构造函数不带任何参数&#xff0c;但是也会因为需要而使用带参数的构造函数。 在带参的构造函数中&#xff0c;是如何继承的呢&#xff0c;这里我们通过使用基类&#xff0c;子类&#xff0c;孙类的两重继承来观察&#xff0c;如何给带参构造函数…

谓词-量词、主析取、主和取范式、前束范式、推理证明

这部分内容&#xff0c;主要需要掌握谓词推理&#xff0c;而前提是掌握将自然语言符号化为谓词、用量词来限定辖域&#xff0c;量词的消去、剩下就是推理过程。还需要掌握的是主析取、主和取范式和前束范式。 存在量词∃&#xff1a;至少有一个 全称量词∀&#xff1a;全都是…

5,sharding-jdbc入门-sharding-jdbc广播表

执行sql #在数据库 user_db、order_db_1、order_db_2中均要建表 CREATE TABLE t_dict (dict_id BIGINT (20) NOT NULL COMMENT 字典id,type VARCHAR (50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 字典类型,code VARCHAR (50) CHARACTER SET utf8 COLLAT…

跟着我学Python进阶篇:02.面向对象(上)

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

【C++】STL 算法 ⑨ ( 预定义函数对象示例 - 将容器元素从大到小排序 | sort 排序算法 | greater<T> 预定义函数对象 )

文章目录 一、预定义函数对象示例 - 将容器元素从大到小排序1、sort 排序算法2、greater<T> 预定义函数对象 二、代码示例 - 预定义函数对象1、代码示例2、执行结果 一、预定义函数对象示例 - 将容器元素从大到小排序 1、sort 排序算法 C 标准模板库 ( STL , Standard Te…

CSS响应式布局

目录 rem单位 媒体查询 rem 媒体查询 rem适配方案&#xff08;了解&#xff09; 响应式布局总结 rem单位 1.设置文字大小的单位 px&#xff1a;设置为固定的css像素 em&#xff1a;相对于父元素字体的大小 %&#xff1a;相对于父元素字体的大小 rem&#xff1a;相对于…

VScode 画图插件

开源免费的插件 随着http://draw.io开源vs code插件之后&#xff0c;它一跃成为最强大的流程图工具。 目前http://draw.io支持3种文件后缀&#xff0c;你只需要新建3种后缀之一的文件就可以在vs code中画流程图&#xff0c;它们分别是&#xff1a; *.drawio*.dio*.drawio.sv…

国家发改委:《电能质量管理办法(暂行)》2024年4月1日起施行

中华人民共和国国家发展和改革委员会令 第8号 《电能质量管理办法(暂行)》已经2023年12月26日第7次委务会议审议通过,现予公布,自2024 年4月1日起施行。 主任 郑栅洁 2023年12月27日 电能质量管理办法&#xff08;暂行&#xff09; 第一章 总则 第一条 为加强电能质量管理&…

红队打靶练习:TOMMY BOY: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB robots.txt get flag1 get flag2 FTP登录 文件下载 更改代理 ffuf爆破 get flag3 crunch密码生成 wpscan 1、密码爆破 2、登录wordpress ssh登录 get flag4 信息收集 get flag5 信息收集 1、arp …

springBoot-Dev tools、Lombok、Spring initializr

1、lombok &#xff08;idea已经有快捷键实现&#xff09; 可以简化Bean的开发&#xff0c;使用注解的形式替代get、set方法&#xff0c;toString方法&#xff0c;全参数构造器&#xff0c;无参构造器&#xff0c;重写equals、hashCode方法。 没卵用&#xff0c;知道即可 1.1配…

112.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图&#xff1a; 常用的窗口类有3个 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的…

【OpenCV学习笔记07】- 【彩蛋】实现轨迹条控制画笔颜色和笔刷半径,并可以正常绘画

彩蛋 实现轨迹条控制画笔颜色和笔刷半径&#xff0c;并可以正常绘画。 直接上彩蛋代码 示例代码&#xff1a; # 彩蛋&#xff0c;创建一个可以调节颜色和笔刷半径的轨迹栏&#xff0c;并且可以通过鼠标进行绘画 import numpy as np import cv2 as cv# 定义全局变量 # 如果 …

简易实现 MyBatis 底层机制

MyBatis 大家好呀&#xff01;我是小笙&#xff0c;我中间有1年没有更新文章了&#xff0c;主要忙于毕业和就业相关事情&#xff0c;接下来&#xff0c;我会恢复更新&#xff01;我们一起努力吧&#xff01; 概述 MyBatis 是一个持久层的框架&#xff08;前身是 ibatis&#x…