avatar
请教一个问题# PhotoGear - 摄影器材
w*x
1
自己想的解法, 一般不能通过现在的number > 之前的number来判断.
, 如果用int统一处理的话可能不能处理INT_MIN的情况, 因为负数范围比正数大一个.
用unsigned int来处理也不能通过判断现在的比值前的数大来决定是否溢出, 并且
unsigned int自己可能溢出.
溢出判断分两阶段, 一个是在增加新digit前作溢出判断, 这个是判断unsigned int自
己不溢出.
if (uRes > UINT_MAX/10 || (uRes == UINT_MAX/10 && nDigit > (UINT_MAX - (UINT
_MAX/10)*10)))
throw CException("Over flow detected");
在unsigned int自己不溢出的情况下判断是否转换成int后会溢出
//update uRes
uRes = uRes*10 + nDigit;
//uLimit = bNeg ? 0x7FFFFFFF + 1 : 0x7FFFFFFF;
//Overflow situation if uRes isn't overflow
if (uRes > uLimit)
throw CException("Over flow detected");
avatar
S*e
2
本来拍的raw格式的照片,
用picasa preview,过2秒图片突然变暗,
这是怎么回事啊?
3x
avatar
h*e
3
我的做法是用long long作为中间变量,当溢出int能存放的
最大/小值以后,就提前退出返回。
还有一种办法是溢出以后符号会改变,用那个来判断。
avatar
c*p
4
用符号判断比较好

【在 h****e 的大作中提到】
: 我的做法是用long long作为中间变量,当溢出int能存放的
: 最大/小值以后,就提前退出返回。
: 还有一种办法是溢出以后符号会改变,用那个来判断。

avatar
l*8
5
溢出之后一定为负数吗?

【在 c****p 的大作中提到】
: 用符号判断比较好
avatar
c*p
6
严格来说会变号
一般情况下是的。。。
唯一比较麻烦的是-2^31,搞成正的话会溢出,但是那个数本身不溢出。

【在 l*********8 的大作中提到】
: 溢出之后一定为负数吗?
avatar
l*8
7
对乘法不成立

【在 c****p 的大作中提到】
: 严格来说会变号
: 一般情况下是的。。。
: 唯一比较麻烦的是-2^31,搞成正的话会溢出,但是那个数本身不溢出。

avatar
w*x
8
不一定会变符号 要是溢出的过头的话. 还有得考虑负数和正数范围不同的问题
avatar
h*e
9
是的,相当繁琐,要判断-2^31/10, (2^31-1)/10这些magic numbers。
我看标准的C实现是用strtol做的,它就是针对这些magic numbers
做了特别处理:
http://www.koders.com/c/fid772A1DFFFF802B239C481E127BE09BA87279

【在 w****x 的大作中提到】
: 不一定会变符号 要是溢出的过头的话. 还有得考虑负数和正数范围不同的问题
avatar
n*e
10
I posted my implementation before. Here is my handling with overflow issue.
//----------------------------------------------------------------
// Compute the cutoff value between legal numbers and illegal
// numbers. That is the largest legal value, divided by the
// base. An input number that is greater than this value, if
// followed by a legal input character, is too big. One that
// is equal to this value may be valid or not; the limit
// between valid and invalid numbers is then based on the last
// digit. For instance, if the range for longs is
// [-2147483648..2147483647] and the input base is 10,
// cutoff will be set to 214748364 and cutLimit to either
// 7 (sign==1) or 8 (sign==-1), meaning that if we have accumulated
// a value > 214748364, or equal but the next digit is > 7 (or 8),
// the number is too big, and we will return a range error.
// Set any if any `digits' consumed; make it sign to indicate
// overflow.
//-----------------------------------------------------------------
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。