我理解int值与存储容量有关。但是,如果我将int 8更改为int 16,只会改变容量吗?
答案 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.