【C语言】整型的存储方式(大小端,原码,反码,补码)

news2025/1/17 1:18:50

目录

一、基本类型

二、原码,反码,补码

2.1 原,反,补的计算方式

2.1.1 正数的原,反,补

2.1.2 负数的原,反,补

2.2 为什么要用补码存放

2.3 大小端是什么?

2.3.1 如何确定当前编译器是那种存储方式

2.4 signed(有符号),unsigned(无符号)

三、练习题

列1

列2

列3

END.


一、基本类型

char             //字符数据类型,用ascall码值存储

short            //短整型

int                //整形

long             //长整型

long long     //更长的整形

二、原码,反码,补码

2.1 原,反,补的计算方式

计算机是用二进制进行各种计算

原码,反码,补码是计算机进行存储数值的编码方式

原码:将数值直接转化为二进制

反码:第一位不变其余位全部取反(原来为1,取反为0)

补码:将反码+1

第一位是符号位,0表示正数,1表示负数

2.1.1 正数的原,反,补

具体怎样存储,举个简单的列子来说明:

int类型占用4个字节,1个字节(Byte)占用8个bit位(8个二进制位),需要32个二进制位才能放得下

正数的原码,反码,补码是相同的

原码:0000 0000 0000 0000 0000 0000 0000 1010(10为正数,最高位为符号位取0)

反码:0000 0000 0000 0000 0000 0000 0000 1010

补码:0000 0000 0000 0000 0000 0000 0000 1010

这里是用16进制进行表示,a表示10

2.1.2 负数的原,反,补

原码:1000 0000 0000 0000 0000 0000 0000 1010(-10为负数,最高位为符号位取1)

反码:1111 1111  1111  1111  1111  1111  1111  0101(符号位不变其余位取反)

补码:1111 1111  1111  1111  1111  1111  1111  0110(反码+1)

(8+4+2+1=15)

由此我们可以得知在计算机中存储时,实际上是存放的补码

2.2 为什么要用补码存放

计算机只会算加法,计算减法是用加一个负数来实现的(a+(-a))

当计算1+(-1)时

原码计算出的结果很显然不是我们所期望的

补码计算

 很显然补码计算的结果是正确的,所以采用补码

2.3 大小端是什么?

细心的同志可能已经有这样的疑问

为什么在计算机中存放数据是反着存放的?

这是因为在内存中存储有两种方式:1.大端字节序存储 2.小端字节序存储

  

大端字节序存储:把一个数据低位字节处的数据存放在高地址中,而高位字节处的数据存放在低地址

 

小端字节序存储:把一个数据高位字节处的数据存放在高地址中,而低位字节处的数据存放在低地址

如果有同志不理解什么是高位字节和低位字节

可以用十进制来类比,1234中4代表个位,1代表千位,所对应的4为低位,1为高位。

2.3.1 如何确定当前编译器是那种存储方式

可以取其他值进行判定,用1判断只是我自己感觉是比较简单的一种 

int main()
{
	int a = 1;
	char* pa = (char*)&a;
	if (*pa == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

2.4 signed(有符号),unsigned(无符号)

我们在上面了解到二进制的最高位为符号位,这是因为在他们类型定义时,定义的是有符号类型,还有一种无符号类型的情况,也就是最高位不再是符号位,和其他位变得一样。

在vs编译器下:int,short等这些类型默认是有符号类型(signed)

虽然都是打印a,但是打印的方式却不同

%d是十进制有符号整数打印,%u是十进制无符号整数打印

-1的补码为:1111 1111  1111  1111  1111  1111  1111  1111

无符号打印就是最高位不在按照符号位处理而是正常的数值进行计算

用计算机可以算一下,确实是这样

三、练习题

列1

答案 

 

解析 

int main()
{
	char a = -1;
	signed char b = -1;
	//-1原码
	//10000000000000000000000000000001
	//反码
	//11111111111111111111111111111110
	//补码(计算机中存放的是补码)
	//11111111111111111111111111111111
	//char类型占一个字节只能存放8个二进制位,多余的要进行截断
	//a中存储的值
	//11111111
	//因为用%d打印,%d是有符号的十进制整数打印需要32位二进制所以需要整型提升
	//整形提升(有符号类型根据符号位来添加,无符号类型用0来添加)
	//111111111111111111111111 11111111(补码)
	//我要想看存放的是什么
	//需要将补码转化为原码
	//11111111111111111111111111111111(补码)
	//11111111111111111111111111111110(反码)
	//10000000000000000000000000000001(原码为-1)
	unsigned char c = -1;

	printf("a = %d b = %d c = %d", a, b, c);
	//a,b打印的值相同也可以看出char在vs编译器下默认的是signed。
	//无符号类型在整型提升时是用0来添加,前边的步骤是相同的就不再赘述
	//c中存放的是11111111
	//整形提升
	//00000000000000000000000011111111
	//结果为255
	
}

列2

答案

 

 解析

int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}
//-128的二进制是
//10000000000000000000000010000000
//char类型只能存放8位二进制需要截断
//存在a里的是
//10000000
//char是有符号类型,根据符号位整型提升
//11111111111111111111111110000000
//%u打印,第一位不在看作符号位
//结果为
//4,294,967,168

 

列3

 答案

解析

char类型的取值范围是-127~128之间,超过这个范围会进行截断,所以它的取值会始终在这个范围里循环。

 


int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	//
	//strlen是求字符串长度的,找的'\0'的位置,统计的\0之前出现多少个字符
	//'\0'的ASCII码值是0
	//a[i]是从-1,-2,-3开始取值,直到取到0
	//由图中可以看出正好是一个从0开始的逆循环,127+128=255
	return 0;
}

 

END.

希望我的文章能给你带来一定的帮助,最后把这句话送给大家。

The real failure is not that you have not done anything, but that you have been willing to fail.

真正的失败不是你没有做成事,而是你甘心于失败。 

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

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

相关文章

明道云联合契约锁共建人事场景电子签约解决方案

背景介绍 在每个组织的人事管理工作中&#xff0c;从招聘、入职、在职、调岗到离职&#xff0c;整个过程中存在大量的合同、证明、函件、通知等文件需要签字盖章。HR每天都要在“核对文件、敲章、通知员工签合同、催进度、给外地员工寄合同、关注合同到期时间等”繁琐的签署工…

使用vite和Element Plus,实现部署后不修改代码/打包,新增主题/皮肤包

Web前端界面切换主题/皮肤&#xff0c;是一个常见的需求。如果希望在打包部署后实现皮肤的修改甚至增加皮肤&#xff0c;不需要修改源码或者重新打包&#xff0c;类似于我们常见的皮肤包扩展&#xff0c;又该如何实现呢&#xff1f; 我使用类似上一期多语言包功能中介绍的方法来…

基于Xlinx的时序分析与约束(3)----基础概念(下)

1、4种基本的时序路径 下图是一张典型的FPGA与上游器件、下游器件通信的示意图&#xff1a; 其可以划分为4条基本的数据路径&#xff0c;这4条路径也是需要进行时序约束的最基本路径。 &#xff08;1&#xff09;寄存器到寄存器 路径2&#xff0c;FPGA内部的寄存器到另一个寄存…

[附源码]Node.js计算机毕业设计高校医疗健康服务系统的设计与实现Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【C++初阶】类和对象(下)再谈构造函数、static成员、C++11的成员初始化新玩法、友元类、内部类

文章目录再谈构造函数static成员C11的成员初始化新玩法友元类内部类再谈构造函数 1.构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&am…

客户管理系统如何提升体验

数字化时代&#xff0c;客户与企业交互的触点爆炸式增长&#xff0c;客户体验正从单一触点走向端到端旅程。众多的产品、海量的数据&#xff0c;导致客户对体验的要求越来越多......CRM客户管理系统是企业提升客户体验的有效工具&#xff0c;它不仅可以帮助您进一步了解客户&am…

App自动化之dom结构和元素定位方式(包含滑动列表定位)

先来看几个名词和解释&#xff1a; dom: Document Object Model 文档对象模型dom应用: 最早应用于html和js的交互。界面的结构化描述&#xff0c; 常见的格式为html、xml。核心元素为节点和属性xpath: xml路径语言&#xff0c;用于xml 中的节点定位&#xff0c;XPath 可在 xml…

javaSE - 三个常用的接口(Comparable,Comparator,Cloneable)

1、Comparable 英 [ˈkɒmpərəbl] 美 [ˈkɑːmpərəbl] 可比较的;可比的;可比性;可比;可比较   2、Comparator 美 [kəmˈpɜrətər] n. 比较器&#xff0c;比色器&#xff0c;比较电路&#xff0c;比长仪&#xff0c;场强计 3、 Cloneable 可复制的 一、Comparable …

MySQL性能优化浅析

1. 硬件 1.1 CPU IO密集型&#xff0c;提升CPU核心数 计算密集型&#xff0c;提升CPU频率 1.2 磁盘 机械硬盘在随机访问时&#xff0c;由于受磁针移动速度的限制&#xff0c;性能会大幅降低。使用固态硬盘可以大幅提升随机访问的能力。按需选择。 1.3 其他 带宽、内存频…

Superset 安装配置

文章目录Superset 安装配置一、Superset 概述1. Superset简介2. 功能概述3. 支持的数据库二、Superset 环境部署步骤三、创建虚拟机&#xff0c;安装CentOS1.下载CentOS2.创建虚拟机3.编辑虚拟机设置4.安装centos7.9mini版本5.启动centos&#xff0c;并进行登录四、CentOS配置1…

小米(Android)刷NetHunter安装指南

一、安装NetHunter 前提&#xff1a;确保手机已经root&#xff0c;已装上magisk。如果没有root&#xff0c;可用尝试magisk root 后执行此文 1、下载Nethunter&#xff1a;Get Kali | Kali Linux 然后push 到sdcard 里&#xff0c; 2、打开magisk&#xff0c;选择刚刚下好的…

Windows下安装libtorch与Clion配置

Windows 安装和使用libtorch 1.下载libtorch libtorch的下载链接&#xff0c;如下图所示&#xff0c;libtorch有release和debug版本可以选择。为了方便调试&#xff0c;下debug版。电脑上没CUDA&#xff0c;下次有需要再更新吧。 2.libtorch使用 在Visual Studio的使用可以参…

云原生周刊 | 让 ChatGPT 以电子邮件的方式来解释 KubeSphere

过去的一周是 ChatGPT 的狂欢&#xff0c;我猜每一位云原生玩家都很好奇他是如何看待 Kubernetes 的。咱们不防换个方式来提问&#xff0c;让它使用电子邮件的方式来向别人推荐 KubeSphere 和 OpenFunction。 开源项目推荐 Tailscale Ingress Controller 这是针对 Tailscale …

【DevOps实战系列】第七章:详解Docker私服Harbor篇

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 Harbor私服搭建 讲完Nexus3再来看下harbor&#xff0c;其实大同小异&#xff0c;只不过harbor的管理要比Nexus3更专业、功能更完善&#xff0c;大家按需选择即可&#xff0c;Nexus的优势是他能和…

web网站工程项目前期需求分析与规划怎么写?

在当下&#xff0c;判断一份网站工程项目文档是否优秀&#xff0c;项目目录是最直接的体现&#xff0c;同时&#xff0c;工程说明、需求分析和项目规划各版块的内容都缺一不可。工欲善其事必先利其器&#xff0c;前期准备得越充分&#xff0c;后期就会越顺利。 本期&#xff0c…

Centos7安装图形化界面并使用Windows远程桌面连接(包含离线部署)

一、在centos7 中部署远程桌面所使用的程序 1、关闭防火墙和selinux(xrdp是通过3389端口远程桌面连接 ) [rootlocalhost ~]# systemctl stop firewalld #临时关闭防火墙 [rootlocalhost ~]# systemctl disable firewalld.service #永久关闭防火墙 [rootlocalhost ~]# setenf…

SpringMVC:SpringMVC之JSON数据传输参数(5)

JSON数据传输参数1 JSON数据传输参数2 JSON普通数组3 JSON对象数据4 JSON对象数组5 小结1 JSON数据传输参数 现在比较流行的开发方式为异步调用。前后台以异步方式进行交换&#xff0c;传输的数据使用的是JSON,所以前端如果发送的是JSON数据&#xff0c;后端该如何接收? 对于…

面试官:单体架构怎么向分布式微服务架构演变的?(8000字干货)

随着网站规模越来越大&#xff0c;单体应用往往很难再满足要求&#xff0c;就需要向分布式&#xff0c;微服务架构演变。 那么这个演变过程是怎么样的呢&#xff1f;都涉及到哪些组件&#xff0c;会遇到哪些问题&#xff0c;以及相应的解决方案都是什么&#xff0c;本篇文章就…

ESP 低功耗入门

此篇博客以 ESP32 为例来说明 ESP 的睡眠模式。 ESP32 芯片可以大致分成以为五个模块&#xff1a; RF 模块&#xff0c;也就是射频模块&#xff0c;用于蓝牙 / Wi-Fi 的收发(TX / RX)功能。CPU&#xff0c;如 Xtensa 内核 (ESP32 / ESP32-S2 / ESP32-S3)&#xff0c;RISC-V 内…

ssm项目-商城管理系统

1 逆向工程设计 1.1 xml文件配置&#xff08;generatorConfig.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"&q…