資料型別的轉化

2021-07-24 14:29:22 字數 2796 閱讀 5360

在c/c++裡,是通過變數型別+變數名+數值,來對乙個變數初始化,同樣,對於任意精度的資料型別,我們也可以採用這種方式來進行變數初始化。在vivado hls裡是支援copy initialization(y)和direct initialization(y)這兩種方式來進行初始化,但不支援uniform initialization,同時,對於任意精度的資料型別,還可以採用基數符號+數值+基數,例如:

int data_i = 5;

ap_int<8> a_8bit_data_c = 18;

ap_int<8> a_8bit_data_d (18);

ap_int<8> a_8bit_data_r2("0b010010",2);

ap_int<8> a_8bit_data_r8("0o22",8);

ap_int<8> a_8bit_data_r10("18",10);

ap_int<8> a_8bit_data_r16("0x12",16);

注意:上面的基數符號是可以去掉的,在初始化的時候,盡可能每一行只初始化乙個變數,避免在一行初始化多個變數
前面我們提到ap_[u]fixed< w,i,q,o>,這裡w代表整個資料的字長,i代表整數部分的字長,那麼小數部分被的字長就是w-i,q表示量化模式(針對低位部分),o表示溢位模式,針對高位部分,例如:

ap_fixed<3,2> data1 = 1.25;

ap_fixed<3,2,ap_rnd> data1 = 1.25

此時的結果分別為1(等價於01.0)和1.5(等價於01.1)

ap_fixed<4,4> data3 = 20

ap_fixed<3,2,ap_rnd,ap_sat> data1 = 20

此時的結果分別為4(等價於0100)和7(等價於0111)

對於單精度型別浮點需要有字尾f,對於雙精度則可以省略,例如:

double data1(2.0)

flout data2(2.0f)

vivado hls對這些資料型別都是支援的,並且還提供乙個數學庫hls_math.h,它對c語言(math.h)和c++(cmath.h)都是支援的,這種支援包括單精度,雙精度浮點的一些函式,還包括對資料型別本身的支援。

隱式資料型別轉換包括numeric promotionnumeric conversion

numeric promotion是一種安全模式,它把資料型別從小型別向大型別的資料轉換,對於有符號資料型別,就是進行資料位的擴充套件,對於無符號資料型別來說,就是進行高位0擴充套件,例如:

ap_uint<8> data;

ap_int<4> x1 = -4;

ap_uint<4> x2 = 4;

data1 = x1;

data2 = x2;

這裡得到的data1為252(0b11111100),由於x1為有符號,所以進行符號位的擴充套件,而data2為4(0b00000100),由於x2為無符號,所以進行高位0的擴充套件。

numeric conversion是把大型別向小型別的資料轉換,這種轉換可能導致資料的損失或者結果的錯誤,例如:

ap_int<2> data;

ap_int<4> x3 = -3;

ap_uint<4> x4= 3;

data3 = x3;

data4 = x4;

這裡得到的data3為-1(0b11),data4為-1(0b11),這是由於data為有符號資料型別,導致結果錯誤。

ap_fixed<4,2> data5 = 1.25;

ap_fixed<3,2,ap_rnd> data6 = data5

這裡得到的data6為1.5(0b01.1),導致資料精度的損失。

顯式資料型別的轉換有兩種方式,一種是通過「( )」操作,另一種是在c++中通過類似呼叫函式的方式進行轉換,例如:

`ap_uint<3> i1 = 2;

ap_uint<4> i2= 7;

ap_ufixed<6,4> i3 = i2 / i1;

cout << 「the result of i3 :\t」 << i3 <<』\n』;

ap_ufixed<6,4> i4 =(ap_ufixed<6,4>) i2 / i1;

cout << 「the result of i4 :\t」 << i4 <<』\n』;

ap_ufixed<6,4> i5 = ap_ufixed<6,4> (i2 )/ i1;

cout << 「the result of i5 :\t」 << i5 <<』\n』;`

這裡得到的i3為3,而i4和i5為3.5,3.5才是我們要的結果,因此對於顯式資料型別的轉換,可以(括號資料型別型別)+變數名 和 資料型別+(變數名)來完成轉換。

注意:在vivado hls 中常用的二進位制運算有+,-,*,/ , %這五種。兩個數相加,為防止溢位,位寬會增加一位。兩個數相乘,最終位寬為兩個數字寬之和。我們的原則是,大資料不溢位(否則導致結果錯誤),小資料不損失(否則導致精度損失)。當我們想要獲取變數的資料型別,我們可以使用typeid(變數名),相應的我們需要宣告typeinfo.h這個標頭檔案。

本文介紹了資料型別的轉化,在vivado hls中,我們要根據演算法的型別來確定合理的位寬,這對運算的結果至關重要,此外,我們在完成資料轉換時,可以採用顯式資料轉換的兩種方式。

資料型別轉化

自己寫的,可能有某些bug,希望大家提出來 函式介紹 進製轉換 函式說明 10進製轉換16進製制 輸入引數 需要轉換的10進製數data 輸出引數 無 int value convert 10 16 int m data return m value 函式介紹 數值轉換 函式說明 對大於10的數進行...

資料型別的轉化

1.基本資料型別 布林型別 數值型別 字串型別 undefined null 2.引用資料型別 陣列 物件 函式 1.布林值 真 true 假 flase 英文 boolean bool 2.字串型別 由字元 數字 符號等組成的一串資料型別 string str 由單引號或者雙引號包裹 字串的拼接 ...

C 的資料型別 資料型別的轉化

一 c 有15個預定義型別,其中13個是值型別,兩個是引用型別 string 和 object 這裡主要說明整型 浮點型 布林型以及引用型 1 整型資料 2 浮點型 浮點型從精度有低到高有float double decimal。他們的命名規則如下 1 float資料型別用於較小的浮點數,因為它要求...