前言
本篇博客作为本人的在CSDN平台的处女作,旨在向刚刚入门单片机的小伙伴们分享我在刚刚接触单片机时遇到的一些疑惑,又或者是我的一些个人经验积累吧。如果您已经是大佬的话,那么本文也许对你们的帮助不大,但是如果细心的你们能发现在下的一些小错误的话,也欢迎你们到评论区友好地与我交流探讨喔~
废话不多说,下面进入正文部分👇
什么是无符号数据类型?
引用百度词条:无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无符号类型全都储存数字。比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。在一些不可能取值为负数的时候,可以定义为unsigned,在一些底层的嵌入式编程的数据一般都是无符号的。也就是说,无符号(u16)与有符号(int)表示的数据大小是一样的,皆为2的16次幂(65536),只是两者表示的数据范围不同而已。
为什么要使用无符号数据类型?
1.规范右移运算符的使用
这部分内容可能需要各位读者有一定的C语言编程经验,一开始可能会因为缺乏一些理论支撑导致难以理解,不过没有关系,慢慢来,等到有一定的知识储备之后再来翻看自己过去那些不能理解的东西,你会顿时恍然大悟的!
首先,在开始我的解释之前,我不得不引入一些重要概念:补码、右移运算符、编译器
由于篇幅有限,我就把每个词条放在这里,便于大家自行阅读了解
事实上,计算机中的数据用二进制表示,数的符号也只能用0/1表示。所以对于有符号数据类型,一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示;而对于无符号数据类型,所有的位都用于表示该数据的大小,无符号位,同时也没有补码这一表示方法。
我们再通过查看右移运算符的这一词条,其中有一句话很关键(下图中的高亮部分)。意思是说:对于无符号类型的数据,其右移的方式是“高位补0、低位舍弃”,称为逻辑右移;但是对于有符号类型的数据在进行右移操作时,高位是补符号位的,这种方式称为算术右移。在实际的程序设计中,我们使用逻辑右移更为频繁,用它搭配左移运算符(移位方式是“低位补0、高位舍弃”)来完成一系列的数值处理,比较常见的一个例子就是可以用来实现LED灯的移位操作。
2.正整数部分的最大取值翻倍
对于确定的数据类型,例如char类型数据的正整数最大值只能是127,而无符号的char能表示的正整数最大值可以扩大到255。比如说,我们需要定义并初始化一个大小为128的变量,这时候我们使用u8这个数据类型来定义这个变量就是最为妥当的,因为这个取值介于127~255之间,char型刚好无法取到这个数值,而对于一个取值不超过255的变量,又无需使用更大的int型来定义一个不那么大的变量,所以使用无符号的char型就可以了,这样做也是为了节省内存(RAM)空间。
3.提高程序运行效率
因为部分编译器对有符号型数据的处理比无符号型的复杂,所以使用无符号型往往效率更高。