0

我有以下行:

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

4 回答 4

2

uByteStart + uByteCount由于它超出了int您平台上的大小(假设为 32 位),因此正转为负数。

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

(§5/5 C++03、§5/4 C++11)如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。

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

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

这减小了求和参数的大小。

于 2013-07-09T07:10:50.287 回答
1

看起来像溢出。Anint不能保存大于 的值INT_MAX

于 2013-07-09T07:10:43.130 回答
1

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

于 2013-07-09T07:13:18.353 回答
1

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

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

代替:

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

做:

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

请注意四舍五入。

于 2013-07-09T07:24:11.043 回答