将int32的乘法转换为int64

时间:2012-07-12 06:28:00

标签: c++

我有以下结构

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与big值相乘,结果存储在unsigned int类型的temp值中,然后存储在int 64中?如果现在怎么会有任何溢出?

由于

1 个答案:

答案 0 :(得分:0)

在乘法之前,

val.myData被转换为无符号的__int64 ,因为你显式地强制转换。 仍然会发生溢出,具体取决于存储在val.myData中的值 - 最大int乘以36000000000不适合6​​4位。 你和演员一起放弃了你的代数符号。

你应该试试这个:

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 );