a8 = int8(127); % sample data
b8 = int8(1); % sample data
a16 = int16(a8); % convert to larger type
b16 = int16(b8); % convert to larger type
c16 = a16 + b16 % do the addition in larger type
c16 = int16
128
c8s = typecast(c16,'int8') % typecast back to int8 (assume 2's complement storage)
c8s = 1x2
-128 0
c8 = c8s(1) % pick either c8s(1) or c8s(2) depending on endian of your machine
c8 = int8
-128
4条答案
按热度按时间z8dt9xmd1#
溢出不是MatLab假设的一部分。您需要使用the modulo function (mod)在脚本中实现此行为。例如:
s5a0g9ez2#
由于您使用127和-128作为示例,因此我假设您使用的是int8变量类型。为了获得您想要的模运算行为,您可以使用一个简单的C Mex例程来进行算术运算(因为您的C编译器很可能会将这种溢出条件优化为简单的模运算行为),或者在m代码中,您可以将其转换为较大的类型并自己进行运算(假设您的机器对整数类型使用2的补码存储)。例如,
如果您使用的是数字数组而不是标量数组,那么可以将其放入循环中,或者将最后一行向量化为c8(1:2:end)或c8(2:2:end)
cbjzeqam3#
您可以使用Fixed-Point toolbox中的fi对象,并将
OverflowAction
设置为Wrap
。使用
fi
应用溢出的int8
类型有点矫枉过正,但也是可能的。示例:
产出:
fkvaft9z4#
如果您确实想使用
int8
溢出,而不是使用mod
函数来模拟它,您可以使用typecast函数。首先,您需要将变量转换为
int
(否则在MatLab中默认为double
)。然后将其转换为int8
,并且只保留第一个字节: