Main Content

整数

整数类

MATLAB® 具有四个有符号整数类和四个无符号整数类。有符号类型使您能够处理负整数以及正整数,但表示的数字范围不如无符号类型广泛,因为有一个位用于指定数字的正号或负号。无符号类型提供了更广泛的数字范围,但这些数字只能为零或正数。

MATLAB 支持以 1 字节、2 字节、4 字节和 8 字节几种形式存储整数数据。如果您使用可容纳您的数据的最小整数类型来存储数据,则可以节省程序内存和执行时间。例如,您不需要使用 32 位整数来存储值 100

下面列出了八个整数类、使用每种类型可存储的值范围以及创建该类型所需的 MATLAB 转换函数。

值的范围

转换函数

有符号 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

创建整数数据

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 提供了以下四种舍入函数:roundfixfloorceilfix 函数使您能够覆盖默认的舍入方案,并朝零舍入(如果存在非零的小数部分):

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 位扩展精度)算法来执行运算,以防止精度损失。

不支持涉及具有整数类型的复数的运算。

整数类的最大值和最小值

每种整数数据类型都存在可以用该类型表示的最大数和最小数。整数类中显示的表在“值的范围”一列中列出了每种整数数据类型的最大值和最小值。

您也可以通过 intmaxintmin 函数获取这些值:

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 最初将输入表示为双精度值。当您将此输入转换为 int64uint64 数据类型时,可能出现精度损失。为了保持精度,请改为对数组的每个标量元素调用 int64uint64

例如,使用 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