C++ Arbitrary Precision Integer Arithmetic
(Ask a Question)The C++ Arbitrary Precision Integer library supports all standard arithmetic, logical bitwise, shifts, and comparison operations. Note that for shifting that >> and << are logical, and the .ashr(x) function implements arithmetic right shift. The output types of an operation are wider than their operands as necessary to hold the result. Operands of ap_int, and ap_uint type, as well as operands of different widths can be mixed freely. By default ap_int will be self-extended to the appropriate width for an operation, while ap_uint will be zero-extended. When mixing ap_int and ap_uint in an arithmetic operation the resulting type will always be ap_int. Some of this behaviour is demonstrated in the example below.
#include "hls/ap_fixpt.hpp" #include "hls/ap_int.hpp" #include <iostream> #include <stdio.h> using namespace hls;
//... ap_int<8> a = 7; ap_int<12> b = 100; ap_uint<7> c = 3; // Multiply expands to the sum of a and b's width ap_int<20> d = a * b; std::cout << "d = " << d << std::endl; // Add result in max of widths + 1 ap_int<13> e = a + b; std::cout << "e = " << e << std::endl; // Logical bitwise ops result in max of widths ap_int<12> f = a & b; std::cout << "f = " << f << std::endl; // Mixing ap_int and ap_uint results in ap_int ap_int<9> g = a + c; std::cout << "g = " << g << std::endl; // ap_(u)int types can be mixed freely with integral types ap_int<33> h = -1 - a; std::cout << "h = " << h << std::endl;