MATLAB 中有 8 种类型的整数,其中包括 4 种有符号整数和 4 种无符号整数:有符号整数能够表示负整数和正整数,而无符号整数类型只能表示正整数和 0。
MATLAB 支持 1、2、4 和 8 字节的有符号整数和无符号整数。这八种数据类型的名称、表示方法和类型转换函数如下表所示。
数据类型 | 取值范围 | 转换函数 |
---|---|---|
有符号 8 位整数 | -27 ~ -27 - 1 | int8() |
有符号 16 位整数 | -215 ~ -215 - 1 | int16() |
有符号 32 位整数 | -231 ~ -231 - 1 | int32() |
有符号 64 位整数 | -263 ~ -263 - 1 | int64() |
无符号 8 位整数 | 0 ~ 28 - 1 | uint8() |
无符号 16 位整数 | 0 ~ 216 - 1 | uint16() |
无符号 32 位整数 | 0 ~ 232 - 1 | uint32() |
无符号 64 位整数 | 0 ~ 264 - 1 | uint64() |
应用时要尽可能用字节数少的数据类型表示数据,这样可以节约存储空间和提高运算速度。例如,最大值为 100 的数据可以用一个字节的整数来表示,而没有必要用八个字节的整数来表示。
MATLAB 存储数值数据的默认类型是双精度浮点数,要存储为整数类型的数据,必须使用上表中的转换函数。
1) 比如,创建一个有符号的 16 位整数:
2) 转换函数还可以用来将其他数据类型转换为整型:
结果将把 str 字符串里面的每一个字符(包括中间的空格)转换为其 ASCII 码,结果输出为:
3) 使用 whos() 函数可显示由一个变量表示的数组的维数、字节计数和数据类型,例如:
结果为:
5) 如果希望知道数据类型,并且指定输出,则可以使用 class() 函数,例如:
结果为:
6) 如果要验证变量是否为整数,则使用 isinteger() 函数:
结果为:
下面的代码演示了基于相同整数数据类型之间的数学运算:
>> k=int8(1:7) %创建一组整数
k =
1 2 3 4 5 6 7
>> m=int8(randperm(7)) %创建一组随机的整数
m =
6 3 7 5 1 2 4
>> k+m %加法
ans =
7 5 10 9 6 8 11
>> k-m %减法
ans =
-5 -1 -4 -1 4 4 3
>> k.*m %元素与元素相乘
ans =
6 6 21 20 5 12 28
>> k./m %元素与元素相除
ans =
0 1 0 1 5 3 2
>> k %重新输出
k =
1 2 3 4 5 6 7
>> k/k(2)
ans =
1 1 2 2 3 3 4
在这些代码中,加法、减法和乘法都比较容易理解,除法稍微复杂一些,因为多数情况下,整数的除法并不一定得到整数结果。
由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出。MATLAB 利用饱和处理此类问题,即当运算结果超出了由 intmin 和 intmax 指定的上下限时,就将该结果设置为 intmin 或 intmax 的返回值,到底是哪一个,主要看溢出的方向。
请看下面的演示代码:
>> k=cast('hellothere', 'uint8') %将字符串转换为uint8类型
k =
104 101 108 108 111 116 104 101 114 101
>> double(k)+150 %double类型的加法
ans =
254 251 258 258 261 266 254 251 264 251
>> k+150 %uint8类型的加法,向上溢出
ans =
254 251 255 255 255 255 254 251 255 251
>> k-110 %uint8类型的减法,向下溢出
ans =
0 0 0 0 1 6 0 0 4 0
总之,MATLAB 支持各种整数数据类型。除 64 位整数数据类型外,其他整数数据类型都具有比双精度类型更高的存储效率。基于同一整数数据类型的数学运算将产生相同数据类型的结果。
混合数据类型的运算仅限于在一个双精度标量和一个整数数据类型数组之间进行。有一点在前面的例子中没有演示,就是整数数据类型中不存在双精度数据类型中常见的 inf 和 NaN。