unsigned详讲(干货满满)

这篇具有很好参考价值的文章主要介绍了unsigned详讲(干货满满)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


什么是unsigned?

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

比如:(signed)int --> int

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

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

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

看例图:

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

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

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

unsigned的深入理解

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

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

例一:

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档
unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

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

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

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

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

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

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

例二:

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档
unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

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

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

整型提升:

整型提升是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

例三:

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档
unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

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

unsigned在c语言中是什么意思,博客日记,c语言,c++,Powered by 金山文档

通过查询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;如有不足,欢迎补充!

继续加油啊,还是那句话:路漫漫其修远兮,吾将上下而求索!!!文章来源地址https://www.toymoban.com/news/detail-634401.html

到了这里,关于unsigned详讲(干货满满)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Transformer详解(李沐大神文字版,干货满满!)

    最近又重温了一下沐神的论文精读系列,发现实在是干货满满,可以说是全程无废话了,每句话都具有价值,但是经常看了一边过后会忘记一些内容,再去回过头来翻看视频就需要花费一些时间来定位到你想要看的位置,所以便萌生了 在看视频的时候把沐神说的话以及画的图

    2024年02月08日
    浏览(40)
  • js--手写call和apply方法干货注释满满

    我们都知道js中call和apply都是改变this指向的,这篇文章我们一起来实现call和apply的底层吧!我们先来看一下js中的call和apply的用法 一.用法 1.call用法 传递参数逗号分隔 2.apply用法 传递参数为数组 二.手写实现call 1.手写myCall改变this指向 这里this指向已经改变,但是还不可以传递

    2024年02月06日
    浏览(42)
  • 共模电感的仿真应用来了,满满的干货送给大家

    作者:一博科技高速先生成员  黄刚 首先一上来先明确下本篇文章需要解决的疑问,主要有2个。一是共模电感本身到底起到怎么样的作用?二是加上共模电感之后的测试眼图为什么反而比不上不加共模电感?这两个问题都会通过本篇文章的仿真验证来告诉大家!   首先我们

    2024年02月02日
    浏览(41)
  • 【必看,干货满满】K8S云原生技术小结

    Docker容器技术总结: 1、Docker容器部署及常用命令详解 2、Dockerfile使用及案例详解 3、Docker容器数据卷详解 4、Docker网络详解 5、Docker资源配额详解 6、Docker私有仓库Harbor搭建及使用 7、Docker图形化管理工具Protainer搭建 8、Docker配置阿里镜像加速源,超详细 9、Ubuntu20.04操作系统安

    2024年02月15日
    浏览(40)
  • 中国电信移动物联网发展成果与创新实践 ,干货满满

    近日, 首届移动物联网大会(2022) (以下简称“大会”)在江苏省无锡市举办。本次大会由工信部指导,中国信息通信研究院(以下简称“中国信通院”)、中国通信学会、无锡市人民政府、人民邮电报社、江苏省工业和信息化厅、江苏省通信管理局共同主办,无锡物联网

    2024年02月09日
    浏览(38)
  • 计算机专业毕业生求职选择及思考(干货满满)

    这个专栏主要是关于应届生求职工作相关的文章,提供一些建议和思考后续持续更新! 计算机专业毕业生求职的整体总结和概括。 首先注意几个求职时间节点: 提前批: 秋招提前批,互联网大厂招聘优秀高校优秀学生开设的招聘活动,都是 优质岗位,有发展的岗位 ,所有

    2024年02月01日
    浏览(50)
  • 阿里云LINUX安装vsftpd完整指南(不浪费时间,干货满满)

    安装前请确保服务器环境干净,如之前安装过该软件,先删除后再进行下一步操作。 出现下图代表安装完成! 软件默认安装在 /etc/vsftpd目录下 /etc/vsftpd/vsftpd.conf 主配置文件,核心配置文件 /etc/vsftpd/ftpusers 黑名单 /etc/vsftpd/user_list 白名单 本地用户登录就是指使用Linux操作系统

    2024年02月09日
    浏览(41)
  • javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满

    高并发三驾马车:分库分表、MQ、缓存。今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现。 一款支持自动分表分库的orm框架 easy-query 帮助您解脱跨库带来的复杂业务代码,并且提供多种结局方案和自定义路由来实现比

    2024年02月06日
    浏览(47)
  • lodash-es 工具库常用工具函数和案例详解,干货满满

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新大数据全套学习资料》,

    2024年04月24日
    浏览(36)
  • 微信小程序使用Echarts-for-weixin实现图表动态更新数据、懒加载(干货满满!!!)

    后端开发入坑全栈之 微信小程序 + Echarts图表 上需求,如下: Apache Echarts是一个基于JavaScript的开源可视化图表库,用于创建各种类型图表,常用图表类型有柱状图、折线图、饼状图、散点图等等。废话不多说,直接上干货!耶✌ 1、下载Echart-for-weixin项目 echart-for-weixin 项目提

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包