unsigned详讲(干货满满)

前言过年偷懒了(●ˇ∀ˇ●),但是年后开学了一定要恢复学习状态,在复习加继续学习的途中,我发现对于unsigned关键字的掌握并不是很熟练,于是翻阅了各个大佬的博客以及书籍,总结了对于unsigned的一些知识点。(如有不对的地方,欢迎各位大佬指正🤭)


什么是unsigned?

从字面上来看,不难理解,unsigned是无符号的意思,事实上,的确没错。它在C语言中和signed相反,signed是有符号的意思。其实C语言中的类型基本上都是有符号类型,只是省去了signed,

比如:(signed)int --> int

(signed char)-->char (这个取决于编译器,绝大多数编译器都是这个,比如我们常用的VS)

在了解什么是无符号之前,我们先了解一下什么是符号位(知道的童鞋可以跳过了)

在计算机处理二进制数据时,专门规定了一位符号位,来确定数据的正负,这个符号位通常是数据的最高位,如8比特位数据,左边第一位就是符号位,剩下七位用来表示数据大小。

看例图:

在知道符号位之后就很容易理解无符号了,无符号嘛就是没有符号位,原来的符号位可以列入计算了。值得一提的是,无符号数都是非负数。


unsigned的深入理解

对于有符号类型的整形打印的时候用%d,对于无符号类型的整形打印时用%u

来看一下下面这几个典型例题,让你捋清它们之间的关系并且对unsigned有进一步的了解

例一:

我们将a初始化为无符号整形,将他以%u的形式打印时,我们知道整数在计算机中存储是以二进制序列补码的形式存储的,正数的补码和原码一样,但是负数的补码是通过原码到反码到补码转换得到的。(这个会放在最后说)

-1的补码是11111111111111111111111111111111(共计32位,因为int类型是4个字节,即32个比特位)

按照等比数列求和公式计算得到2^32-1=4294967295. 这与代码跑出来的结果一致。

但是以%d的形式打印时为什么是-1呢?因为以%d形式打印时,系统会将a认为是有符号整形,自然而然的将第一位视为了符号位,经过反码到原码的反变换得到原码是:10000000000000000000000000000001 即 -1。

我们经过调试发现在仅以%d形式打印完后,a的数值仍是4294967295。这说明在printf函数内部进行打印时以怎么样的类型打印并不改变数据原来的类型。

例二:

对于这个题中涉及到了整型提升,如果不理解整型提升是无法理解这道题的。

所以在解决这道题之前,先简单解释一下什么是整型提升

整型提升:

整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

这是百度百科里面给的解释,是不是有些难以理解?那么来点通俗易懂的。

对于这道题来讲,就是以%d(4字节)打印的时候,不足四个字节的类型比如short,char等类型就要发生整型提升来补到4个字节,正数补0,负数补1(往左端补)。比如变量a,它的类型是char类型,大小是1个字节,它的补码是11111111,8个比特位,因为要以%d形式打印,所以要发生整型提升,就变成了11111111111111111111111111111111

打印时仍然为-1。

同样变量b的类型是short,大小为两个字节所以发生整型提升后也为11111111111111111111111111111111,结果为-1

变量c变量d都是不足4字节的无符号整形,(无符号整形视为非负数)发生整型提升时前面补0,最终序列为

c:00000000000000000000000011111111 ---->2^8-1=255

d00000000000000001111111111111111 ----->2^16-1=65535

变量e本身就是4个字节,无需发生整型提升。因为是无符号整型,所以视为非负数,原码反码补码都一样,2进制补码为11111111111111111111111111111111

以%d形式(有符号整形)打印时第一位视为符号位,则视为负数,通过转换得到原码

10000000000000000000000000000001--->-1,最终结果为-1

由此我们得到结论:

对于负数:

//1.不发生整型提升的情况下,有符号数和无符号数以%u打印结果一样。(因为以无符号整型打印,都吧把符号位纳入计算)

//2.发生整型提升的情况下,有符号数前面补1,无符号数补0

例三:

通过之前的学习我们知道,sizeof是用来计算大小的单目操作符,那么a的类型是int,sizeof(a)是4,那显然-1<4啊,理应输出<,但是系统却输出了>,这是为什么呢?

通过查询MSDN我们发现sizeof返回值是size_t类型,也就是unsigned int类型。

那么在a和其做比较时,a会被转换为无符号类型作比较。a被转换为无符号类型后大小为2^32-1,显然大于4,所以输出 >

By the way:此处的a仍然为int类型,只是作比较时视为无符号类型哟,和之前的printf有异曲同工之处。

结论:在将一个有符号整形和无符号整形作比较时,会将有符号整形视为无符号整形来作比较,但不改变有符号整形变量的性质。


附:计算机中二进制数据的原码反码补码。

整形数据在计算机中存储时都是以补码形式存储的,因为:

  1. 补码使得符号位能与有效值部分一起参加运算,从而简化运算规则。

  1. 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

  1. 保证了0的唯一性,保证了数的表示的准确性。

对于正数来讲:

原码反码补码都相同

对于负数来说:

反码=原码符号位不变,其他位按位取反

补码=反码+1

举个例子:-10(以8bit位数据为例)

原码:10001010

反码:11110101

补码:11110110


结语:

对于整数其实不管怎么存,它的二进制序列是不变的,只是解释的方式不同,那么打印出来的数值就不同了.

ok辣,以上就是unsigned的详细讲解了。如有错误,欢迎指正qaq;如有不足,欢迎补充!

继续加油啊,还是那句话:路漫漫其修远兮,吾将上下而求索!!!

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

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

相关文章

P9 C++类

目录 01 类是什么 02 如何创建类 03 方法 后话 本期我们要讲的是 C 中的类。 我们终于讲到了面向对象编程&#xff0c;这是一种非常流行的编程方式&#xff0c;面向对象编程实际上只是一种你可以采用的编写代码的方式&#xff0c;其他语言例如 C#、Java 这些主要是面向对象…

白嫖CTG4.0

大家好&#xff0c;到点了我来给各位大佬献策CTG&#xff0c;不是花钱买不起&#xff0c;而是免费更有性价比&#xff0c;哈哈哈不调侃了我们自此开始正文&#xff0c;咱们主打的就是一个分享是一种态度 当然我更希望大家支持国产对国产有自己的信心&#xff08;文心一言&…

多模态——使用stable-video-diffusion将图片生成视频

多模态——使用stable-video-diffusion将图片生成视频 0. 内容简介1. 运行环境2. 模型下载3. 代码梳理3.1 修改yaml文件中的svd路径3.2 修改DeepFloyDataFiltering的vit路径3.3 修改open_clip的clip路径3.4 代码总体结构 4. 资源消耗5. 效果预览 0. 内容简介 近期&#xff0c;…

理解CLIP模型

1.简介 学习深度学习必看CLIP&#xff01;论文链接arxiv.org/pdf/2103.00020v1.pdf。 简单来说就是传统的分类任务被用来预测指定的类别&#xff0c;有监督训练限制了模型的通用性和可用性&#xff0c;并且需要带有标签的数据来训练&#xff0c;该篇论文就想直接从原始文本中…

Navicat 技术指引 | 适用于 GaussDB 的用户权限设置

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

Spring 七大组件

文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean&#xff0c;它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…

(Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、本文代码数据说明手册分享 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译&am…

Flink Flink中的分流

一、什么是分流 所谓“分流”&#xff0c;就是将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个DataStream&#xff0c;定义一些筛选条件&#xff0c;将符合条件的数据拣选出来放到对应的流里。 二、基于filter算子的简单实现分流 其实根据条件筛选数据的需求…

面了一个4年经验的测试工程师,自动化都不会也要15k,我也是醉了····

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

表单考勤签到作业周期打卡打分评价评分小程序开源版开发

表单考勤签到作业周期打卡打分评价评分小程序开源版开发 表单打卡评分 表单签到功能&#xff1a;学生可以通过扫描二维码或输入签到码进行签到&#xff0c;方便教师进行考勤管理。 考勤功能&#xff1a;可以记录学生的出勤情况&#xff0c;并自动生成出勤率和缺勤次数等统计数…

ruoyi-plus-vue部署

安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 可能遇到的错误 Failed to deploy ruoyi/ruoyi-server:5.1.0 Dockerfile: ruoyi-admin/Dockerfile: Cant retrieve im age ID from build stream 安装 vim 命令 yum install vim -y 修改文件 vim /etc/re…

基于Springboot的冬奥会科普平台(有报告),Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的冬奥会科普平台&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ELK+kafka+filebeat企业内部日志分析系统

1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布…

创新研报|企业如何在不确定时期突破至新高度?

报告下载地址&#xff1a; 创新研报&#xff5c;BCG 2023最创新企业研究-在不确定时期跃升新高度 创新从未如此重要&#xff0c;领先的企业创新者正在证明这一切。BCG&#xff08;于2005年首次发布年度创新报告&#xff0c;其中列出了全球创新高管最钦佩的50家企业&#xf…

【MATLAB源码-第88期】基于matlab的灰狼优化算法(GWO)的栅格路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…

数据结构-归并排序+计数排序

1.归并排序 基本思想&#xff1a; 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个…

2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2023年P气瓶…

pulseaudio是如何测试出音频延迟的

通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…

红队攻防实战之从边界突破到漫游内网(无cs和msf)

也许有一天我们再相逢&#xff0c;睁大眼睛看清楚&#xff0c;我才是英雄。 本文首发于先知社区&#xff0c;原创作者即是本人 本篇文章目录 网络拓扑图&#xff1a; 本次红队攻防实战所需绘制的拓扑图如下&#xff1a; 边界突破 访问网站&#xff1a; http://xxx.xxx.xxx…

Linux 排查必看文件

目录 1. 登录日志 1.1 /var/log/wtmp 1.2 /var/log/btmp.* 1.3 /var/log/lastlog 1.4 /var/log/faillog 1.5 /var/log/secure 1.6 /var/log/auth.log 2. 系统日志 2.1 /var/log/cron.* 2.2 /var/log/syslog 2.3 /var/log/audit/audit.*log 3. 历史命令 3.1 ~/…