将int 8更改为int 16

时间:2016-08-09 20:33:25

标签: matlab

我理解int值与存储容量有关。但是,如果我将int 8更改为int 16,只会改变容量吗?

4 个答案:

答案 0 :(得分:1)

每种类型的整数都有不同的存储容量范围:

int 8:值范围为-128到127

int 16:值范围从-32,768到32,767

答案 1 :(得分:1)

转换为精度较低数据类型时,只需担心数据丢失。由于int16的精度高于int8,因此您的现有数据将保持不变,但您的数据可以跨越两倍的值,但代价是占用两倍的空间(2个字节对​​1个字节)

a = int8(127);
b = int16(a);

a == b
% 1

whos('a', 'b')

%  Name      Size            Bytes  Class    Attributes
%
%  a         1x1                 1  int8
%  b         1x1                 2  int16

答案 2 :(得分:1)

由于其他答案尚未正式确定,我将向您提供解释,包括一些关键词以及一些更精细的解释。

数据类型的大小实际上取决于存储容量。

  

int8 - 8位有符号整数,MSB(最高有效位)表示符号。范围[-2 ^ 7,2 ^ 7-1] = [-128,127]

     

uint8 - 8位无符号整数,MSB表示2的最高功率。范围[0,2 ^ 8-1] = [0,255]

     

int16 - 16位有符号整数

     

uint16 - 16位无符号整数

我可以继续,但你可能会得到照片。还有 int32,uint32,int64,uint64。

还有 char 可以用于文本,但也可以代替 uint8 (在MATLAB中 char 是16位虽然)(不同之处在于char被打印为char而不是数字)。对于许多类似c语言来说,这是正常的。

类型 float double 是不同的,因为它们使用由IEEE标准化的浮点精度。该格式用于以良好的方式表示大数字。

此数据类型使用数字的指数表示。数据类型为指数和精确数字分配一组固定的位,为符号分配一位。浮点数可以这样划分,

  

(符号),尾数,指数

对于双倍,比特分配是1比特用于符号,11比特用于指数,52比特用于尾数。对于单个,指数为8位,尾数为23位。

这是讨论类型转换的一些必要背景。在讨论类型转换时,您通常会谈到隐式转化显式转化。这些术语与Matlab并不真正相关,因为Matlab可以自动识别类型。

a = 2; % a is a double
b=a; % b is a double

c = int8(57); % c is an int8
d = c; % d is an int 8

然而,使用内置转换函数进行显式转换。

c = int8(57);
d = char(c);

在讨论不同类型的转换时,我们经常谈论类型促销类型降级。类型提升是指将精度较低的数据类型提升为更高精度的类型。

a = int8(57);
b = int16(a);

这是无损的,被认为是安全的。另一方面,当一种较高的精度转换为较低精度的类型时,类型降级。

c = int16(1234);
d = int8(c); % Unsafe! Data loss

这通常被认为是有风险的并且应该避免。通常不会经常使用单词类型降级,因为这种转换并不常见。需要检查从较高精度到较低精度的转换。

function b = int16ToInt8(a)
if (any(a < -128 | a > 127))
    error('Variable is out of range, conversion cannot be done.');
end
b=int8(a);

在大多数语言中,无法隐式执行降级。还应避免在浮点类型和整数类型之间进行转换。

这里重要的一点是Matlab如何启动变量。如果“构造函数”使用(如a=int8(57)),则Matlab会自动将变量设置为双精度。此外,当您启动像int64([257,3745,67])这样的整数的向量/矩阵时,首先调用矩阵的“构造函数”。所以int64()实际上会在双打矩阵上调用。这很重要,因为如果整数需要比52位更多的精度,则精度对于double来说太低了。所以

int64([2^53+2^0,2^54+2^1, 2^59+2^2]) ~=
         [int64(2^53) + int64(2^0), int64(2^54)+ int64(2^1), int64(2^59)+ int64(2^2)]

此外,如果设备上的内存允许,通常建议使用 int32 int64 double

答案 3 :(得分:1)

int8变量的范围可以从-128到127,而int16类的范围是-32,768到32,767。显然,记忆是支付更广范围的代价;)

注1: 这些限制在定义变量时不仅适用于变量,而且通常也适用于计算输出!

示例:

>> A = int8([0, 10, 20, 30]);
>> A .^ 2

ans =

  0  100  127  127

>> int16(A) .^ 2

ans =

  0  100  400  900

注2: 切换到 int16后,通常应该为所有参与计算的变量执行此操作。

示例:

>> A + int16(A)
Error using  + 
Integers can only be combined with integers of the same class, or scalar doubles.