整形在内存中的存储(例题逐个解析)

目录

一.相关知识点

1.截断:

2.整形提升:

3.如何 截断,整型提升?

(1)负数

(2)正数

(3)无符号整型,高位补0

注意:提升后得到的是补码。要根据打印类型,判断是否有符号位;有效数字

二.例题

1.

2.

3.

4.

疑问:不应该算数转换为unsigned int 吗?

5.

6.


一.相关知识点

1.截断:

直接保留低位的二进制位

2.整形提升:

表达式中的字符(char)短整形(short)操作数在使用之前被转换为普通整型(int),这种转换称为整型提升

3.如何 截断,整型提升?

整型提升是按照变量的数据类型的符号位来提升的

(1)负数
char c1 = -1;

截断:-1的补码为:11111111111111111111111111111111 。 -1为int占4字节,c1是char占1字节。

         直接保留 int 所占4字节中低位的1字节的二进制位:11111111

整型提升:因为 char 为 signed char 。所以整形提升的时候,高位补充符号位,即为1

                 提升后的结果为:11111111111111111111111111111111

(2)正数
char c2 = 1;

截断:1的补码为:00000000000000000000000000000001 。1为int占4字节,c1是char占1字节。

           直接保留 int 所占4字节中低位的1字节的二进制位:00000001

整型提升:因为 char 为 signed char 。所以整形提升的时候,高位补充符号位,即为0

                 提升后的结果为:00000000000000000000000000000001

(3)无符号整型,高位补0

注意:提升后得到的是补码。要根据打印类型,判断是否有符号位;有效数字

二.例题

1.

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

题解:

int main()
{char a = -1;//-1 是整数,32bit//11111111111111111111111111111111   (int)-1的补码//11111111 - char a 截断//11111111111111111111111111111111   提升(得到补码)signed char b = -1; //和a等价unsigned char c = -1;//11111111111111111111111111111111   (int)-1的补码//11111111 - char a 截断//00000000000000000000000011111111 - 提升,无符号的整型,高位补0// //      -1    -1   255printf("a=%d,b=%d,c=%d", a, b, c);//%d是打印有符号的整数return 0;
}

2.

int main()
{char a = -128;printf("%u\n", a);//%u 打印无符号整型return 0;
}

题解:

int main()
{char a = -128;//10000000000000000000000010000000//11111111111111111111111101111111//11111111111111111111111110000000 - 128的补码//10000000 - a//11111111111111111111111110000000//%u - 第一位不是符号位printf("%u\n", a);//4294967168return 0;
}

3.

int main()
{char a = 128;printf("%u\n", a);return 0;
}

题解:

int main()
{char a = 128;//00000000000000000000000010000000 - 128的补码//10000000 - a//11111111111111111111111110000000printf("%u\n", a);//4294967168return 0;
}

4.

int main()
{int i = -20;unsigned int j = 10;printf("%d\n", i + j);return 0;
}

题解:

int main()
{int i = -20;unsigned int j = 10;//10000000000000000000000000010100 - -20的原码//11111111111111111111111111101011 - -20的反码//11111111111111111111111111101100 - -20的补码//00000000000000000000000000001010 -  10的补码//11111111111111111111111111110110 - 和的补码//11111111111111111111111111110101 - 和的反码//10000000000000000000000000001010 - 和的原码printf("%d\n", i + j);//-10return 0;
}
疑问:不应该算数转换为unsigned int 吗?

如果这样,根据和的反码,第一位不是符号位,结果为4294967286

但是,我们是以 %d 形式打印的,如果是以 %u 打印,确实是4294967286。

我以 %d(有符号的整数) 的形式打印,我就认为内存里存的是有符号数。

        %u                                               我就认为内存里存的是无符号数。

理论上说,i+j 结果确实是无符号数。但是你是个无符号数也悠不住我用 %d 来打印。

一个数据放在内存里,它有无符号没法确定,是用的人决定它有无符号

从哲学角度来说,一个东西是什么,取决于看待的人的视角

5.

(1)
int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);}return 0;
}

由于 i 是 unsigned int ,所以 i 不论怎么减,都不会 > 0 。

我们这样演示:

#include <windows.h>
int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);Sleep(1000);}return 0;
}

(2)
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}

strlen 统计 ' \0 ' 之前的个数,' \0 ' 的ASCII码值为0 。所以本题是想让你判断,什么时候 a 里放第一个0

char 大多数是 signed char 其取值范围为 -128~127

所以放到 a 里的数字依次是:-1  -2  -3 ...... -127  -128  127  126  ...... 2  1  0  -1  -2  ......

到 0 之前是 128+127=255,结果就是255

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

i <= 255 的判断进入循环条件一直成立,循环不会停下来,一直打印 hello world

6.

int main()
{char a = 3;char b = 127;char c = a + b;printf("%d", c);return 0;
}

题解:

int main()
{//char --> signed charchar a = 3;//00000000000000000000000000000011//截断//00000011 - achar b = 127;//00000000000000000000000001111111//截断 //01111111 - bchar c = a + b;//00000011//01111111//整型提升//00000000000000000000000000000011//00000000000000000000000001111111//00000000000000000000000010000010 - 和的补码// 截断//10000010 - cprintf("%d\n", c);//-126//%d 是打印十进制的整数//11111111111111111111111110000010 - 补码//11111111111111111111111110000001//10000000000000000000000001111110 - 原码//-126return 0;
}

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章

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

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

相关文章

HTML中滚动加载的实现

设置div的overflow属性&#xff0c;可以使得该div具有滚动效果&#xff0c;下面以div中包含的是table来举例。 当table的元素较多&#xff0c;以至于超出div的显示范围的话&#xff0c;观察下该div元素的以下3个属性&#xff1a; clientHeight是div的显示高度&#xff0c;scrol…

Netty基础—7.Netty实现消息推送服务二

大纲 1.Netty实现HTTP服务器 2.Netty实现WebSocket 3.Netty实现的消息推送系统 (1)基于WebSocket的消息推送系统说明 (2)消息推送系统的PushServer (3)消息推送系统的连接管理封装 (4)消息推送系统的ping-pong探测 (5)消息推送系统的全连接推送 (6)消息推送系统的HTTP…

人工智能助力家庭机器人:从清洁到陪伴的智能转型

引言&#xff1a;家庭机器人进入智能时代 过去&#xff0c;家庭机器人只是简单的“工具”&#xff0c;主要用于扫地、拖地、擦窗等单一任务。然而&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;家庭机器人正经历从“机械助手”向“智能管家”甚…

ssh转发笔记

工作中又学到了&#xff0c;大脑转不过来 现有主机A&#xff0c;主机B&#xff0c;主机C A能访问B&#xff0c;B能访问C&#xff0c;A不能访问C C上80端口有个服务&#xff0c;现在A想访问这个服务&#xff0c;领导让用ssh转发&#xff0c;研究半天没找到理想的语句&#xf…

清晰易懂的Miniconda安装教程

小白也能看懂的 Miniconda 安装教程 Miniconda 是一个轻量级的 Python 环境管理工具&#xff0c;适合初学者快速搭建 Python 开发环境。本教程将手把手教你如何在 Windows 系统上安装 Miniconda&#xff0c;并配置基础环境&#xff0c;确保你能够顺利使用 Python 进行开发。即…

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源&#xff08;如日志文件、消息队列等&#xff09;传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点&#xff1a; 可扩展&#xff1…

破解企业内部盗版软件管理难题的技术方案

引言&#xff1a;盗版软件——企业数字化转型的“隐形地雷” 据BSA《全球软件调查报告》显示&#xff0c;37%的企业存在员工私自安装盗版软件的行为&#xff0c;由此引发的法律诉讼、数据泄露及罚款风险年均增长28%。LMT基于“预防-检测-治理”三位一体技术框架&#xff0c;为…

Spring源码解析

第一讲 容器接口 BeanFactory和ApplicationContext接口的具体继承关系&#xff1a; ApplicationContext 间接继承了BeanFactory BeanFactory是父接口ApplicationContext是子接口&#xff0c;里面一些功能调用了BeanFactory BeanFactory的功能 表面上只有 getBean&#xff0…

Django Rest Framework 创建纯净版Django项目部署DRF

描述创建纯净版的Django项目和 Django Rest Framework 环境的部署 一、创建Django项目 1. 环境说明 操作系统 Windows11python版本 3.9.13Django版本 V4.2.202. 操作步骤(在Pycharm中操作) 创建Python项目drfStudy、虚拟环境 ​虚拟环境中安装 jdangopip install django==4.…

图解AUTOSAR_CP_NetworkManagementInterface

AUTOSAR 网络管理接口(Nm)详解 AUTOSAR 网络管理接口规范与实现指南 目录 1. 概述 1.1. 网络管理接口的作用1.2. 网络管理接口的特点 2. 网络管理接口架构 2.1. 架构概览2.2. 模块交互关系 3. 网络管理状态机 3.1. 状态定义3.2. 状态转换 4. 协调算法 4.1. 协调关闭流程4.2. 同…

java学习总结(八):Spring boot

一、SpringBoot简介 传统Spring开发缺点&#xff1a; 1、导入依赖繁琐 2、项目配置繁琐 Spring Boot是全新框架(更像是一个工具&#xff0c; 脚手架)&#xff0c;是Spring提供的一个子项目&#xff0c; 用于快速构建Spring应用程序。 随着Spring 3.0的发布&#xff0c;Spring 团…

vue-router实现

实现一个简化版的 vue-router 可以帮助我们更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于浏览器的 URL 来管理组件的显示&#xff0c;能够根据 URL 变化切换不同的视图。下面是一个简化版的实现&#xff0c;用于帮助你理解基本的路由机制。 创建一个简单的 V…

Redis 服务器:核心功能与优化实践

Redis 服务器:核心功能与优化实践 引言 Redis(Remote Dictionary Server)是一款高性能的键值对存储系统,广泛用于缓存、消息队列、实时排行榜等场景。本文将深入探讨Redis服务器的核心功能,并提供一些优化实践的技巧,以帮助读者更好地理解和运用Redis。 Redis的核心功…

openEuler24.03 LTS下安装MySQL8

前提条件 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEuler24.03 LTS 步骤 卸载原有mysql及mariadb sudo systemctl stop mysql mysqld 2>/dev/null sudo rpm -qa | grep -i mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps 2>/dev/…

GLOW-TTS

我首先需要理解用户的指令&#xff0c;用户希望我翻译文章的3.1节“Training and Inference Procedures”部分。为了完成这个任务&#xff0c;我需要仔细阅读文章的3.1节&#xff0c;理解其中的技术细节和概念&#xff0c;然后将这些内容准确地翻译成中文。 在阅读3.1节时&…

【算法思想】高精度

引入 首先了解&#xff1a; 1. int 范围为10^9 2. long long 范围数量级为10^18 如果超过该数量级&#xff0c;该怎么办&#xff1f; ——这就是高精度、大数的算法问题 加法 输入两个整数a,b,输出他们的和&#xff08;<10的500次方&#xff09; 核心是加法的核心——》每…

【失败了】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库

LazyGraphRAG测试结果如下 数据&#xff1a; curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./ragtest/input/book.txt 失败了 气死我也&#xff01;&#xff01;&#xff01;对deepseek-V3也不是很友好啊&#xff0c;我没钱prompt 微调啊&#xff0c;晕死…

ccfcsp3402矩阵重塑(其二)

//矩阵重塑&#xff08;其二&#xff09; #include<iostream> using namespace std; int main(){int n,m,t;cin>>n>>m>>t;int c[10000][10000];int s0,sum0;int d[10000],k[100000];for(int i0;i<n;i){for(int j0;j<m;j){cin>>c[i][j];d[s…

算法-除自身以外数组的乘积

力扣题目&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums…

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果&#xff1a; 前言 在PhotoShop中我们经常会用到抠图操作&#xff0c;现在就用Shader实现一个简单的抠图效果。 实现原理&#xff1a; 使用当前像素颜色与需要抠掉的颜色相减作比较&#xff0c;然后与一个指定的阈值比较以决定是否将其显示出来&#xff1b; U…