In MATLAB, one option you have is to overload the methods that handle arithmetic operations for integer data types, creating your own custom overflow behavior that will result in a "wrap-around" of the integer value. As stated in the documentation:
You can define or overload your own
methods for int*
(as you can for any
object) by placing the appropriately
named method in an @int*
folder within
a folder on your path. Type help
datatypes
for the names of the methods
you can overload.
This page of the documentation lists the equivalent methods for the arithmetic operators. The binary addition operation A+B
is actually handled by the function plus(A,B)
. Therefore, you can create a folder called @int32
(placed in another folder on your MATLAB path) and put a function plus.m
in there that will be used instead of the built-in method for int32
data types.
Here's an example of how you could design your overloaded plus
function in order to create the overflow/underflow behavior you want:
function C = plus(A,B)
%# NOTE: This code sample is designed to work for scalar values of
%# the inputs. If one or more of the inputs is non-scalar,
%# the code below will need to be vectorized to accommodate,
%# and error checking of the input sizes will be needed.
if (A > 0) && (B > (intmax-A)) %# An overflow condition
C = builtin('plus',intmin,...
B-(intmax-A)-1); %# Wraps around to negative
elseif (A < 0) && (B < (intmin-A)) %# An underflow condition
C = builtin('plus',intmax,...
B-(intmin-A-1)); %# Wraps around to positive
else
C = builtin('plus',A,B); %# No problems; call the built-in plus.m
end
end
Notice that I call the built-in plus
method (using the BUILTIN function) to perform addition of int32
values that I know will not suffer overflow/underflow problems. If I were to instead perform the integer addition using the operation A+B
it would result in a recursive call to my overloaded plus
method, which could lead to additional computational overhead or (in the worst-case scenario where the last line was C = A+B;
) infinite recursion.
Here's a test, showing the wrap-around overflow behavior in action:
>> A = int32(2147483642); %# A value close to INTMAX
>> for i = 1:10, A = A+1; disp(A); end
2147483643
2147483644
2147483645
2147483646
2147483647 %# INTMAX
-2147483648 %# INTMIN
-2147483647
-2147483646
-2147483645
-2147483644
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…