计算过程中C ++奇怪的值

时间:2013-07-09 07:09:20

标签: c++ math

我有以下一行:

int iEndFrame = ((uByteStart + uByteCount-1) / g_iByteSize1FrameDecoded) + 1;

我的价值观是:

uByteStart = 2147479808
uByteCount = 8684
g_iByteSize1FrameDecoded = 1920

但是,iEndFrame变为-1118477,这可能不正确。

有人看到我的错误吗?

感谢您的帮助!

PS: 声明是:

void CApp::pCalcFrames(int uByteStart, int uByteCount, int &uStartFrame, int &uFramesToRead, int& uOffset)

4 个答案:

答案 0 :(得分:2)

uByteStart + uByteCount正在变为负数,因为它超出了平台上int的大小(假设为32位)。

重要的是不要这样做,因为从技术上讲,行为是未定义的,因此您的代码将无法移植:

  

(§5/ 5 C ++ 03,§5/ 4 C ++ 11)如果在评估表达式时,   结果不是数学定义或不在范围内   其类型的可表示值,行为未定义。

一个解决方案(但请注意,由于连续整数除法的截断效应,它不会那么准确)是写

uByteStart / g_iByteSize1FrameDecoded + (uByteCount-1) / g_iByteSize1FrameDecoded + 1;

减少了求和参数的大小。

答案 1 :(得分:1)

看起来像溢出。 int无法保存大于INT_MAX的值。

答案 2 :(得分:1)

您的int可能是32位宽。如果是这样,您的算术计算会产生有符号整数溢出,从而触发未定义行为

答案 3 :(得分:1)

就像在其他答案中指出的那样,你有一个整数溢出。

在您的情况下应该很容易解决(假设最终结果可以适合int):

而不是:

int iEndFrame = ((uByteStart + uByteCount-1) / g_iByteSize1FrameDecoded) + 1;

做的:

int iEndFrame = uByteStart / g_iByteSize1FrameDecoded + 
                uByteCount / g_iByteSize1FrameDecoded - 1 / g_iByteSize1FrameDecoded + 1;

请注意四舍五入。