uint与int的区别

为什么与如何使用uint

在这里插入图片描述
开始时这里有几个无符号的整数,这没有什么问题,如果你深入研究机器码去看你会发现在任何设备上它们都不过是无符号整数。所有其他的值比如说intfloatboolcharacter,和string都是无符号整数的形式或者集合,对于swift这样的现代高级语言我们一般对这件事情不会考虑太多,但是在有些时候无符号整型则变得重要起来。

有符号与无符号整型之间的区别

在我们开始之前,这是一些给不熟悉计算机科学核心观点的人的背景知识,我们通常以字节为单元衡量数据的存储,每一个字节由二进制的位组成。取决于每一台电脑的处理器,它们的位数是不同的,例如:Apple][+是八字节的,ipones直到ipone5是三十二字节的,从ipone5开始就成了64字节了。

由于一个字节可以被打开或是关闭,这样我们就有了两个状态,计算机科学家意识到,一系列的位可以用二的幂相加。一个四位的数字可以被用来代表0-15,一个八位的数字可以被用来代替0-255,一个三十二位的数字的取值范围则是0-4,294,967,295,一个六十四位的数字的取值范围是0到一个很大的数字,我们大可不必去考虑它(大约1.844 x 10 ^ 19)。

每一个位变成了一个二的幂-它是一个二进制的数字,例如一个4位的数子1010变成了

1 * 8 = 8
0 * 4 = 0
1 * 2 = 2
0 * 1 = 0

把位加在一起,8 + 2 = 10,4位数字1111是15,四位数字0000是0。为了避免二进制数字和十进制数字混淆,前缀0b通常被用在代码或者文献中去描述一个二进制数字,例如0b1011是十进制的11。

但是这些数字仅仅是正数,对零减去1,程序会崩溃并抛出异常,对于很多的计算,我们需要出现负数。计算机科学提出了一个出色的解决方案我们称之位有符号数字,取出字节的第一位使之位正数和负数的标记,如果是零的话,值是正数,如果是一的话,值是负数。使用一个4位的例子,0b0101是一个有符号整数5。然而有一个原因我不太想讨论,它们做了一个不够直观的事情,负数从其最大值倒数。例如0b1101是一个有符号整数 0b111-0b101,它们是-2,而不是您直观认为的-5。

介绍Uint的特点

由于我们使用正负数字比仅带正数的时候多,所以我们的int被设计为有符号的,如果我们想使用一个值没有符号,这个时候我们就可以使用UINT,UINT创建了一个整数,该整数与处理器处理的位数相同,你唯一使用UINT的理由如下:当你想使用一个很大的数字,但最大值会取决于机器而改变,那对你来说可不是个好主意.

其他无符号整数的用处是需要一个特殊位数的数字的时候,Swift提供了类型UInt8,UInt16,UInt32,UInt64,这些是8,16,32,64位的数字,为什么我们需要这些,因为大多数符号整形的使用都会指定使用的位数.

无符号整数是纯1和0, 我们有几种使用它们的方法,我们可以是每一位分别代表着其他东西的状态,这在控制设备中很常见,你可以使用一个字节的不同位来打开或关闭一个设备的不同部分(C++中您可以使用bitset).其他的用处是将值限定在两个数字之间.很多设备,无论它有多么的复杂,任然使用着传统的8位,16位,32位的值.在网络上和非Apple的API的标准RGB颜色是三个八位的集合,分别是红色,绿色和蓝色.

无符号整形的基本数学

无符号整形的数学运算与Int相同,唯一的例外是: 你需要去注意边界,剩下的都可以正常工作了

let c:UInt8 = 0b00000101
let d:UInt8 = 128 //0b10000000
let e:UInt8 = 255 //0b11111111
let f:UInt8 = 10 //0b00001010

print("Math operators")
print(d + 1 ) // 129
print(d - 1 ) // 127
print(f * 2) // 20
print(d / 3) // 42

然而 这样将会返回一个异常

print(f - 11)

或者这样

print(e + 1)

两者都超过了 0 - 255 的界限

原文
https://makeapppie.com/2016/01/29/how-and-why-to-use-unsigned-integers-uint/

posted @ 2022-07-02 13:18  李兆龙的博客  阅读(522)  评论(0编辑  收藏  举报