C++ C++;计算过程中的奇异值

C++ C++;计算过程中的奇异值,c++,math,C++,Math,我有以下几行: int iEndFrame = ((uByteStart + uByteCount-1) / g_iByteSize1FrameDecoded) + 1; 我的价值观是: uByteStart = 2147479808 uByteCount = 8684 g_iByteSize1FrameDecoded = 1920 但是,iEndFrame变为-1118477,这是不正确的 有人看到我的错误了吗 谢谢你的帮助 附言: 宣言是: void CApp::pCalcFrames(

我有以下几行:

int iEndFrame = ((uByteStart + uByteCount-1) / g_iByteSize1FrameDecoded) + 1;
我的价值观是:

uByteStart = 2147479808
uByteCount = 8684
g_iByteSize1FrameDecoded = 1920
但是,iEndFrame变为-1118477,这是不正确的

有人看到我的错误了吗

谢谢你的帮助

附言: 宣言是:

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

看起来像溢油了。
int
不能保存大于
int\u MAX

的值,看起来像是溢出。
int
不能保存大于
int\u MAX
uByteStart+uByteCount
的值,因为它超过了平台上
int
的大小(假设为32位)

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

(§5/5 C++03,§5/4 C++11)如果在表达式求值期间, 结果未在数学上定义或不在 对于其类型的可表示值,行为未定义

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

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

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

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

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

(§5/5 C++03,§5/4 C++11)如果在表达式求值期间, 结果未在数学上定义或不在 对于其类型的可表示值,行为未定义

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

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

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

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

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

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

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

而不是:

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


注意四舍五入。

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

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

而不是:

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


注意四舍五入。

好的,我需要将变量从int改为“较大”类型。我应该选择什么呢?有没有办法抛出错误?我需要更改很多变量来保存更大的值,如果没有抛出错误,我恐怕会错过一些。如果您不想应用我建议的方法,可以将类型更改为
unsigned
,因为它们显然是非负的。如果这还不够,
long
可能会有帮助好的,我需要将变量从int改为“更大”的类型。我应该选择什么呢?有没有办法抛出错误?我需要更改很多变量来保存更大的值,如果没有抛出错误,我恐怕会错过一些。如果您不想应用我建议的方法,可以将类型更改为
unsigned
,因为它们显然是非负的。如果这还不够,
long
可能会有所帮助