我有以下一行:
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)
答案 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;
请注意四舍五入。