C++ Arbitrary Precision Integer Explicit Conversions
(Ask a Question)The ap_[u]int
types support several explicit conversion functions which
allow the value to be interpreted in different ways. The to_uint64()
function will return a 64 bit unsigned long long
with the same bits as the
original ap_[u]int
, zero extending and wrapping as necessary. Assigning an
ap_[u]int
wider than 64 bits to an unsigned long long
would also wrap to match widths, without needing to call to_uint64()
. The
to_int64()
function will return a 64 bit signed long
long
and will sign extend as necessary.
An arbitrary precision integer data type can be casted to an arbitrary precision
fixed-point data type with the to_fixpt<I_W>()
and
to_ufixpt<I_W>()
functions (returns ap_fixpt<W,
I_W>
and ap_ufixpt<W, I_W>
types respectively), with
the same bits as the original ap_[u]int<W>
. For more on the
ap_[u]fixpt
template, please refer to the C++ Arbitrary Precision Fixed Point
Library section.
An example demonstrating these functions is shown below.
#include "hls/ap_int.hpp" #include <iostream> #include <stdio.h> using namespace hls;
//... // zero extend 16 bit -32768 to 64 bit 32768 unsigned long long A = ap_int<16>(-32768).to_uint64(); std::cout << "A = " << A << std::endl; // wrap from 65 bit 2**64 + 1 to 64 bit 1 unsigned long long B = ap_uint<65>("10000000000000001").to_uint64(); std::cout << "B = " << B << std::endl; // interpret 8 bit uint as 8 bit ufixpt with four bits above decimal // by value 248 becomes 15.5 (== 248 / 2**4) ap_ufixpt<8, 4> C = ap_uint<8>(248).to_ufixpt<4>(); std::cout << "C = " << C << std::endl; // interpret 4 bit int as 4 bit fixpt with leading bit 8 bits above decimal // by value -8 becomes -128 (== -8 * 2**4) ap_fixpt<4, 8> D = ap_int<4>(-8).to_fixpt<8>(); std::cout << "D = " << D << std::endl; // interpret 6 bit int as 6 bit ufixpt with 6 bits above decimal // by value 8 becomes 8 ap_ufixpt<6, 6> E = ap_int<6>(8).to_ufixpt<6>(); std::cout << "E = " << E << std::endl;