코드놀 : 오버플로우 검출 하기... 코드 실행법.

힘내라의 이미지

코드놀이터에 얼마전에 두 수의 합이 오버플로우인지 검출하는 문제가 나왔더군요.

긴 코드도 아니고 공부에 도움이 될꺼 같아
초보가 한번 풀어보고자 했지만...머리에 김만 나고 있습니다. ㅠ.ㅠ

거의 이해가 안되서 코드를 풀어달라는 부탁은 못드리겠구..

그래서 직접 실행하면서 중간에 변수값 출력하면서
보면 알기 쉬울꺼 같은데...

kkb110님이 올려주신 실행소스 실행조차 못하겠습니다.

inline unsigned int getcycle() 
{ 
   __asm 
   { 
      cpuid 
      rdtsc 
   } 
} 
#define repeatN 100000000 

int main() 
{ 
   unsigned int cycle1,cycle2; 
   int a,b,t; 
   cin >> a; 
   cin >> b; 

   getcycle();getcycle();getcycle(); 
   cycle1 = getcycle(); 
   for (int i = repeatN; i; --i) 
   { 
      t +=i; 
      t += func_NAME(a,b); 
   } 
   cycle2 = getcycle(); 
    
   cout << "speed : " << ((double)(cycle2-cycle1))/(repeatN/100) << "\n\n\n"; 
    
   cout << t; 
   cin >> t; 
   return 0; 
}

이거 실행되는 풀 소스만 수정해서 올려주셨으면 합니다 ^^;;;;;

저거 그대로 쳐서
위에 #include <stdio.h>
붙여도 뭔 에러만 잔뜩 나오고 하나도 모르겠네요..

제일 위에 inline 이게 뭔지도 모르겠고...
밑에 답글을 읽어보니

doldori님의

template<typename SignedIntegralType> 
bool OutOfRange(SignedIntegralType a, SignedIntegralType b) 
{ 
    return (b > 0 && a > std::numeric_limits<SignedIntegralType>::max() - b) || 
           (b < 0 && a < std::numeric_limits<SignedIntegralType>::min() - b); 
} 

가 가장 좋은 정답이라는데...

std::numeric_limits<SignedIntegralType>::

이게 대체 뭔지도 모르겠고 제가 보는 C책이 몇권 있는데
저런거 비슷한 구문조차 없습니다...정말 참담합니다.
이 짧은것도 이해가 안되니...ㅠ.ㅠ
(혹시 C++ 라면... 전혀 모릅니다.. 구경도 안했습니다)

마지막으로
CHAR_BIT, SignedIntegralType <- 이런값은 어디서 확인하나요?

CHAR_BIT 그냥 해석하면.. 말그대로 8bit 일꺼 같기는 한데..뭔지..

스텍공부해서 혼자 1자리 계산기 만들어보고 좋아한게 엇그제 같은데..
프로그래밍 너무 어렵네요....

소리의 이미지

두 코드 모두 C++입니다. 즉 실행하기 원하시면 C++ 컴파일러로 컴파일하셔야 합니다.

첫번째 코드의 경우 상단에 다음 두 줄을 넣어주셔야 할 것 같습니다.

#include <iostream>
using namespace std;

CHAR_BIT는 C 표준 헤더인 <limits.h>에서 정의하는 매크로로, 값은 예상하신대로입니다.

SignedIntegralType은 프로그래머가 C++의 템플릿(Template) 기능으로 임의 정의한 가상 타입명입니다. (template<typename SignedIntegralType>)

첫번째 코드의 cin >>은 C의 scanf()라고, cout <<는 printf()라고 생각하시면 C 지식만으로도 이해하실 수 있을 거라 생각하지만, 두번째 코드를 이해하기 원하시면 C++를 공부하셔야 할 것 같습니다.

이번 문제는 C++를 모르셨기에 생긴 것이니, 어렵게 생각하실 필요 없이 차근차근 공부해나가시면 될 겁니다. ^^

doldori의 이미지

C로 작성된 코드가 아니니 이해가 안된다고 해서 비관하지 마시고요.
C로 바꾸면 다음과 같이 됩니다.

#include <limits.h>

int OutOfRange(int a, int b) 
{ 
    return (b > 0 && a > INT_MAX - b) || 
           (b < 0 && a < INT_MIN - b); 
} 
kkb110의 이미지

다른것들은 윗분들이 다 잘 설명해 주신것 같고

남은부분은 이부분인거같은데

inline unsigned int getcycle() 
{ 
   __asm 
   { 
      cpuid 
      rdtsc 
   } 
} 

표준 c++는 아니고 어셈코드입니다.
VC++에서는 컴파일이 되구요 GCC에서는 안해봤어요.
혹시 GCC쓰신다면 관련 인라인 어셈 문서를 찾아보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.