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
可能会有所帮助