int 형이므로 a, b 부호가 다르면 일단 over-, underflow 가 발생하지 않을 것이고, 부호가 같다면 절대값으로 문제를 해결할 수도 있을 것 같습니다.
일단 범위를 줄여서 생각해봅시다. int 말고 signed char 타입으로 생각해볼께요. (값의 범위만 틀리지 특성은 동일하므로)
signed char 타입이 가지는 범위는 -128 ~ 127 입니다.
여기서 덧셈 연산의 overflow 는 두 양 수의 합이 127을 넘는 경우이고 양의 두 수의 합의 최대값은 127 + 127 = 254 ( <= 255 ) 입니다. 그러므로 unsinged char 로 두 수를 변환한 후에 더하고 그 값을 구해서 127 < sum 이라고 판단하면 될 것 같습니다.
음수의 최소값은 -128 이므로 2개의 음수의 합의 최소 절대값은 256 이 되기때문에 unsigned char 로는 표현할 수 없는 숫자가 됩니다. 그러므로 128 < abs(a) + abs(b) 같이 하면 두 수의 절대값의 합이 256이 아닌 underflow 를 판별할 수 있습니다.
이 경우는 예외처리를 해서 두수가 모두 -128 이면 underflow 로 동작하게 해야 할 것 같습니다.
이제 이것을 범위를 넓혀서 int 의 최대 최소값을 조사하셔서 적용하시면 되겠습니다. 일반적으로 2의 보수로 표현하는 정수의 경우 타입의 비트수가 n 이면 -2^(n-1) <= num <= 2^(n-1)-1 이므로 해당하는 환경의 int 타입의 비트수를 조사하시면 되겠습니다.
재미있는 문제로군요. 일단 연산 결과가 표현 가능한 범위 안에서 이루어져야 한다는
bugiii님의 말씀이 결정적인 힌트입니다. a + b > max를 바꿔서 a > max - b로,
a + b < min을 a < min - b로 생각하면 되겠습니다. 다른 사칙연산에 대해서도
유사한 방법으로 하면 됩니다. 곱셈과 나눗셈의 경우에는 좀 더 복잡합니다만.
htna wrote:
int라고 함수에서 한정을 지어서 이렇게 했습니다만..
정확하게 하자면 signed냐 unsigned냐에 따라 다르게 작업(어디에?)이 들어가야 겠지요 ?
그리고 각 데이터 타입에 따라 다르게 들어가야 하구요..
PS:
허거걱... 여기에
overunderflow_signed, overunderflow_unsigned
를
overunderfulo_signed, overunderfulo_unsigned
로 적었네요..
흐미.. 다른분들 보구 또 머라 하시겠다.. ㅡ.ㅜ
수정합니다.. ^^;;
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
재미있는 문제로군요. 일단 연산 결과가 표현 가능한 범위 안에서 이루어져야 한다는
bugiii님의 말씀이 결정적인 힌트입니다. a + b > max를 바꿔서 a > max - b로,
a + b < min을 a < min - b로 생각하면 되겠습니다. 다른 사칙연산에 대해서도
유사한 방법으로 하면 됩니다. 곱셈과 나눗셈의 경우에는 좀 더 복잡합니다만.
x86 instruction manual 을 찾아봤습니다...
Quote:
It evaluates the result for both signed and unsigned integer operands and sets the OF and CF flags to indicate a carry(overflow) in the signed or unsigned result, respectively
재미있는 문제로군요. 일단 연산 결과가 표현 가능한 범위 안에서 이루어져야 한다는
bugiii님의 말씀이 결정적인 힌트입니다. a + b > max를 바꿔서 a > max - b로,
a + b < min을 a < min - b로 생각하면 되겠습니다. 다른 사칙연산에 대해서도
유사한 방법으로 하면 됩니다. 곱셈과 나눗셈의 경우에는 좀 더 복잡합니다만.
x86 instruction manual 을 찾아봤습니다...
Quote:
It evaluates the result for both signed and unsigned integer operands and sets the OF and CF flags to indicate a carry(overflow) in the signed or unsigned result, respectively
OF 플래그나 CF 플래그가 발생했는지 확인해보면 되겠군요 :)
곱하기나 나누기도 마찬가지입니다 =3=33
Architecture Dependent?
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
bool func(int a, int b)
{
unsigned int c, result;
c = (unsigned)a + (unsigned)b;
result = (a ^ c) & (b ^ c);
if (result & (0x80 << (sizeof(int)-1)*8))
return 1;
else
return 0;
}
숙제같은 느낌이 드는건 왜일까요. ?[code:1]bool func&
숙제같은 느낌이 드는건 왜일까요. ?
__max_int, __min_int 는 알아서.. ㅋㅋ
int만 가지고 확인하는 방법이 있기는 하지만...
직접 알아보시는것도.. ^^
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
[quote="htna"][code:1]bool func(int
int 와 long 타입의 크기가 같은 환경에서는 곤란하지 않을까요?
int 형이므로 a, b 부호가 다르면 일단 over-, underflow 가 발생하지 않을 것이고, 부호가 같다면 절대값으로 문제를 해결할 수도 있을 것 같습니다.
일단 범위를 줄여서 생각해봅시다. int 말고 signed char 타입으로 생각해볼께요. (값의 범위만 틀리지 특성은 동일하므로)
signed char 타입이 가지는 범위는 -128 ~ 127 입니다.
여기서 덧셈 연산의 overflow 는 두 양 수의 합이 127을 넘는 경우이고 양의 두 수의 합의 최대값은 127 + 127 = 254 ( <= 255 ) 입니다. 그러므로 unsinged char 로 두 수를 변환한 후에 더하고 그 값을 구해서 127 < sum 이라고 판단하면 될 것 같습니다.
음수의 최소값은 -128 이므로 2개의 음수의 합의 최소 절대값은 256 이 되기때문에 unsigned char 로는 표현할 수 없는 숫자가 됩니다. 그러므로 128 < abs(a) + abs(b) 같이 하면 두 수의 절대값의 합이 256이 아닌 underflow 를 판별할 수 있습니다.
이 경우는 예외처리를 해서 두수가 모두 -128 이면 underflow 로 동작하게 해야 할 것 같습니다.
이제 이것을 범위를 넓혀서 int 의 최대 최소값을 조사하셔서 적용하시면 되겠습니다. 일반적으로 2의 보수로 표현하는 정수의 경우 타입의 비트수가 n 이면 -2^(n-1) <= num <= 2^(n-1)-1 이므로 해당하는 환경의 int 타입의 비트수를 조사하시면 되겠습니다.
p.s. 숙제스러운 질문에 직접적인 코드는 기술하지 맙시다. -_-;
음.. 재밌네요..이런거에 재미를 붙이다니. orz테스트는 안해봤
음.. 재밌네요..
이런거에 재미를 붙이다니. orz
테스트는 안해봤습니다.
PS:
kkb110님이 올리신 글을보고 숙제는 아니라고 판단이 들었네요.
class CBigInteger 머 이런거 만드는 게시판에 올라온 글의 내용을.
여기에 부분적으로 따로 올리신듯...
PS2:
int라고 함수에서 한정을 지어서 이렇게 했습니다만..
정확하게 하자면 signed냐 unsigned냐에 따라 다르게 작업(어디에?)이 들어가야 겠지요 ?
그리고 각 데이터 타입에 따라 다르게 들어가야 하구요..
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
[code:1]template<typename T>T XX
XXX의 명칭이 머더라..
치매가오려나.. 기억이 안나네요...
음...
ASM에서 두 변수의 연산시에 발생한는 overflow bit를 이용하는 방법도 있기는 한데..
기억이 잘 안나네요.. 오래되넘은 거라서...
그렇다고 다시 학부때 ASM 책 뒤지기는 싫고..
귀차니즘의 압박이... orz
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
그래서 절대값을 구하고 unsigned char 를 이용했습니다.
그래서 절대값을 구하고 unsigned char 를 이용했습니다.
주어진 타입보다 큰 타입을 이용하면 해당 환경이 지원하지 못하는 경우에는 구현이 불가능합니다.
또한 두 수의 합을 같은 타입으로 계산하면 타입의 최소, 최대값의 경계 값을 넘어서서 오버레핑이 일어나면 잘못된 비교가 될 수 있습니다.
그래서, 어떻게든 연산의 결과가 타입의 범위 안에서 이루어지도록 해야 한다고 생각해서 글을 올렸습니다.
p.s. 엇? 글이 하나가???
[quote="bugiii"]p.s. 엇? 글이 하나가???[/quote
사라졌죠.. ^^;;
제가 올린 글이 좀 딴지성 같아서 올리자마자 지웠는데...
그새 새로운 글이 밑에 붙었네요..
음.. 글 지우는거 정말 조심해야 겠군요..
죄송합니다. ^^
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
재미있는 문제로군요. 일단 연산 결과가 표현 가능한 범위 안에서 이루어져
재미있는 문제로군요. 일단 연산 결과가 표현 가능한 범위 안에서 이루어져야 한다는
bugiii님의 말씀이 결정적인 힌트입니다. a + b > max를 바꿔서 a > max - b로,
a + b < min을 a < min - b로 생각하면 되겠습니다. 다른 사칙연산에 대해서도
유사한 방법으로 하면 됩니다. 곱셈과 나눗셈의 경우에는 좀 더 복잡합니다만.
이걸 보면 템플릿이 딱 떠오르는군요.
힌트 끝! ^^;
코드 좀 정리 합니다...속도좀 빠르게 하려구요.. ^^;이런거
코드 좀 정리 합니다...
속도좀 빠르게 하려구요.. ^^;
이런거 재미붙이면 안되는데...
근데 제대로 돌아갈까요.. ??
돌려보지를 않아서리. orz
PS:
허거걱... 여기에
overunderflow_signed, overunderflow_unsigned
를
overunderfulo_signed, overunderfulo_unsigned
로 적었네요..
흐미.. 다른분들 보구 또 머라 하시겠다.. ㅡ.ㅜ
수정합니다.. ^^;;
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
[quote="doldori"]재미있는 문제로군요. 일단 연산 결과가 표
x86 instruction manual 을 찾아봤습니다...
OF 플래그나 CF 플래그가 발생했는지 확인해보면 되겠군요 :)
곱하기나 나누기도 마찬가지입니다 =3=33
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
???
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
[quote="정태영"][quote="doldori"]재미있는 문제로군요
Architecture Dependent?
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
Re: 퀴즈! 두 int값의 +연산후 오버플로우 여부 알아내기...
Warning on Line 003 : Prototype of function 'func' specified to return 'bool' value. Garbage value will return
I am compiler... orz
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
c에서 플래그 레지스터의 상태를 얻어오는 방법은 없나요??
c에서 플래그 레지스터의 상태를 얻어오는 방법은 없나요??
To be or not to be.
That is the question.
[quote="cppig1995"]Architecture Dependen
예 아키텍쳐에 의존적이긴 하겠지요 :)
인라인 어셈블리를 쓰는 거 말고는 잘 모르겠군요....
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Re: ???
두 수를 더한 결과가 범위를 넘어선다면 더하는 행위 자체가 정의되지 않는 결과를
낳습니다. a + b 같은 코드가 나오면 안되는 거죠.
htna님이 하신거랑 비슷하지만[code:1]bool func
htna님이 하신거랑 비슷하지만
댓글 달기