整数
整数类
MATLAB® 具有四个有符号整数类和四个无符号整数类。有符号类型使您能够处理负整数以及正整数,但表示的数字范围不如无符号类型广泛,因为有一个位用于指定数字的正号或负号。无符号类型提供了更广泛的数字范围,但这些数字只能为零或正数。
MATLAB 支持以 1 字节、2 字节、4 字节和 8 字节几种形式存储整数数据。如果您使用可容纳您的数据的最小整数类型来存储数据,则可以节省程序内存和执行时间。例如,您不需要使用 32 位整数来存储值 100
。
下面列出了八个整数类、使用每种类型可存储的值范围以及创建该类型所需的 MATLAB 转换函数。
类 | 值的范围 | 转换函数 |
---|---|---|
有符号 8 位整数 | –27 到 27–1 |
|
有符号 16 位整数 | –215 到 215–1 |
|
有符号 32 位整数 | –231 到 231–1 |
|
有符号 64 位整数 | –263 到 263–1 |
|
无符号 8 位整数 | 0 到 28–1 |
|
无符号 16 位整数 | 0 到 216–1 |
|
无符号 32 位整数 | 0 到 232–1 |
|
无符号 64 位整数 | 0 到 264–1 |
|
创建整数数据
MATLAB 默认情况下以双精度浮点形式 (double
) 存储数值数据。要以整数形式存储数据,您需要从 double
转换为所需的整数类型。使用上表中所示的转换函数之一。
例如,如果要以 16 位有符号整数形式存储赋给变量 x
的值 325
,请键入
x = int16(325);
如果要转换为整数的数值带有小数部分,MATLAB 将舍入到最接近的整数。如果小数部分恰好是 0.5
,则 MATLAB 选择绝对值较大的最接近的整数:
x = 325.499; int16(x)
ans = int16 325
x = x + .001; int16(x)
ans = int16 326
如果您需要使用非默认舍入方案对数值进行舍入,MATLAB 提供了以下四种舍入函数:round
、fix
、floor
和 ceil
。fix
函数使您能够覆盖默认的舍入方案,并朝零舍入(如果存在非零的小数部分):
x = 325.9; int16(fix(x))
ans = int16 325
同时涉及整数和浮点数的算术运算始终生成整数数据类型。MATLAB 会在必要时根据默认的舍入算法对结果进行舍入。以下示例生成 1426.75
的确切答案,然后 MATLAB 将该数值舍入到下一个最高的整数:
int16(325)*4.39
ans = int16 1427
在将其他类(例如字符向量)转换为整数时,这些整数转换函数也很有用:
chr = 'Hello World';
int8(chr)
ans = 1×11 int8 row vector 72 101 108 108 111 32 87 111 114 108 100
如果您将 NaN
值转换为整数类,则结果为该整数类中的 0
值。例如:
int32(NaN)
ans = int32 0
整数类的算术运算
MATLAB 可以对以下类型的数据执行整数算术运算:
整数或具有相同整数数据类型的整数数组。算术运算生成的结果与操作数具有相同的数据类型:
x = uint32([132 347 528]) .* uint32(75); class(x)
ans = 'uint32'
整数或整数数组以及双精度标量浮点数。算术运算生成的结果与整数操作数具有相同的数据类型:
x = uint32([132 347 528]) .* 75.49; class(x)
ans = 'uint32'
对于一个操作数为整数数据类型(64 位整数除外)的数组,另一个操作数为双精度标量的所有二元运算,MATLAB 会使用按元素双精度算法来执行运算,然后将结果重新转换为原始的整数数据类型。对于涉及 64 位整数数组和双精度标量的二元运算,MATLAB 会使用扩展精度(比如 80 位扩展精度)算法来执行运算,以防止精度损失。
不支持涉及具有整数类型的复数的运算。
整数类的最大值和最小值
每种整数数据类型都存在可以用该类型表示的最大数和最小数。整数类中显示的表在“值的范围”一列中列出了每种整数数据类型的最大值和最小值。
您也可以通过 intmax
和 intmin
函数获取这些值:
intmax("int8")
ans = int8 127
intmin("int8")
ans = int8 -128
如果您将大于某个整数数据类型的最大值的数值转换为该类型,MATLAB 会将其设置为最大值。同样,如果您转换小于该整数数据类型的最小值的数值,MATLAB 会将其设置为最小值。例如:
x = int8(300)
x = int8 127
x = int8(-300)
x = int8 -128
此外,当涉及整数的算术运算的结果超出该数据类型的最大值(或最小值)时,MATLAB 也会将其设置为最大值(或最小值):
x = int8(100)*3
x = int8 127
x = int8(-100)*3
x = int8 -128
转换导致的精度损失
当创建由大整数(大于 flintmax
)的数值组成的数组时,默认情况下,MATLAB 最初将输入表示为双精度值。当您将此输入转换为 int64
或 uint64
数据类型时,可能出现精度损失。为了保持精度,请改为对数组的每个标量元素调用 int64
或 uint64
。
例如,使用 int64
将大整数数值数组转换为 64 位有符号整数数组。输出数组会损失精度。
Y_inaccurate = int64([-72057594035891654 81997179153022975])
Y_inaccurate = 1×2 int64 row vector
-72057594035891656 81997179153022976
请改为对每个标量元素调用 int64
以返回准确的数组。
Y_accurate = [int64(-72057594035891654) int64(81997179153022975)]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975
您还可以使用整数的十六进制或二进制值创建整数数组而不会损失精度。
Y_accurate = [0xFF000000001F123As64 0x1234FFFFFFFFFFFs64]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975