sc_uint<1>とsc_biguint<1>の「~」演算
前回が bool型についてだったので sc_uint<1>だとどうなるのか?
っということで試してみました。
- サンプルコード
#include <stdio.h> #include <systemc.h> int main (int argc, char* argv[]) { bool bool_bit1 = 0; int bool_data = ~bool_bit1; bool bool_bit1not = ~bool_bit1; cout << " [bool] bit1 = " << bool_bit1 << endl; cout << " [bool] data = " << bool_data << endl; cout << " [bool] ~bit1 = " << ~bool_bit1 << endl; cout << " [bool] bit1not = " << bool_bit1not << endl; cout << "" << endl; sc_uint<1> uint_bit1 = 0; int uint_data = ~uint_bit1; sc_uint<1> uint_bit1not = ~uint_bit1; cout << " [sc_uint<1>] bit1 = " << uint_bit1 << endl; cout << " [sc_uint<1>] data = " << uint_data << endl; cout << " [sc_uint<1>] ~bit1 = " << ~uint_bit1 << endl; cout << " [sc_uint<1>] bit1not = " << uint_bit1not << endl; cout << "" << endl; sc_biguint<1> buint_bit1 = 0; sc_biguint<1> buint_data = (~buint_bit1); sc_biguint<1> buint_bit1not = ~buint_bit1; cout << " [sc_biguint<1>] bit1 = " << buint_bit1 << endl; cout << " [sc_biguint<1>] data = " << buint_data.to_int64() << endl; cout << " [sc_biguint<1>] ~bit1 = " << ~buint_bit1 << endl; cout << " [sc_biguint<1>] bit1not = " << buint_bit1not << endl; return 0; }
- 実行結果
$> ./main [bool] bit1 = 0 [bool] data = -1 [bool] ~bit1 = -1 [bool] bit1not = 1 [sc_uint<1>] bit1 = 0 [sc_uint<1>] data = -1 [sc_uint<1>] ~bit1 = 18446744073709551615 [sc_uint<1>] bit1not = 1 [sc_biguint<1>] bit1 = 0 [sc_biguint<1>] data = 1 [sc_biguint<1>] ~bit1 = 1 [sc_biguint<1>] bit1not = 1
せっかくなので、bool型も書いてます。
実行結果をみてもらうと boolとsc_uint<1>の結果が
おかしいことがわかると思います。
では、なぜ逆に sc_biguint<1>の結果は正しいのか?
もう少し詳細を見てみましょう。
演算子「~」のオーバーロード関数の実装
sc_biguint は sc_dt::sc_unsignedクラスを継承しています。
その中で、
sc_unsigned operator~ ( const sc_unsigned & u )として、定義があり、最終的には sc_bit.hまで辿り着きます。
そこで、実際に実行されているものが、
friend const sc_bit operator ~ ( const sc_bit& a ) { return sc_bit( ! a.m_val ); }
になり、「!」を使っているのがわかります。
ということで、sc_biguint<1>の結果だけ正しくなっているというわけです。