0

私は次の構造を持っています

struct {
    int myData;
    int myAnotherData;
}Value;

struct AnotherStructure {
    unsigned int uiLowData;
    unsigned int uiHighData;
};

AnotherStructure m_AnotherStructure;
Value val;
val.myData = 10;
#define MULTIPLY 36000000000

unsigned __int64 &internalStructure = *(unsigned __int64*)&m_AnotherStructure;
internalStructure  = 0;
internalStructure += ((unsigned __int64)val.myData * MULTIPLY );

私の質問は、unsigned int に大きな値を乗算しているため、上記のケースでデータのオーバーフローがあることです。結果は unsigned int 型の一時値に格納され、次に int 64 に格納されますか? 今ならオーバーフローしないのはどうですか?

ありがとう

4

1 に答える 1

0

val.myData は、明示的にキャストするため、乗算のに unsigned __int64にキャストされます。val.myData に格納されている値によっては、依然としてオーバーフローが発生する可能性があります。36000000000 を掛けた最大の int は 64 ビットに収まりません。そして、キャストで代数記号を失います。

これを試してください:

struct AnotherStructure {
    int64_t uiLowData;
    int64_t uiHighData;
};
// signed_128bit_integer: look into your compiler documentation
signed_128bit_integer &internalStructure = *(signed_128bit_integer*)&m_AnotherStructure;
internalStructure  = 0;
internalStructure += ((signed_128bit_integer)val.myData * MULTIPLY );
于 2012-07-12T08:03:27.313 に答える