[해결]#define뒤의 매크로상수가 16진수일때와 10진수일때의 차이에 대해

tokubetu111의 이미지

안녕하세요.
일단 소스입니다.

--------------------------------------------------------------------------
(1) typedef unsigned int uint32;
(2) #define TWO_GIGA (uint32)(2*1024*1024*1024)
(3)
(4) uint32 gSize = 0;
(5)
(6) int main()
(7) {
(8) /* something excute */
(9) ...
(10)
(11) if (gSize >= TWO_GIGA)
(12) {
(13) /* something excute */
(14) ...
(15) }
(16)
(17) /* something excute */
(18) ...
(19)
(20) return 0;
(21)}

line11 Warning: #61-D: integer operation result is out of range

--------------------------------------------------------------------
2번째라인을 #define TWO_GIGA 0x80000000으로 하면 워닝메세지가 뜨지않습니다.
차이는 매크로상수가 16진수인가 10진수인가 하는 것인데요.

이유아시는 분은 좀 가르쳐주세요!

Fe.head의 이미지

정수 범위를 벗어 났다고 하네요.

#define TWO_GIGA ((uint32)2*1024*1024*1024)

이렇게 해보심이.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

tokubetu111의 이미지

말씀대로 했는데도, 같은 워닝이 나오네요.^^

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

Scarecrow의 이미지

10진수와 16진수의 차이가 아니라...

signed와 unsigned의 차이라고 보이는군요...

2*1024*1024*1024의 값은 signed입니다.
그러니 아마 계산중에 오버플로어가 될듯합니다.

freestyle의 이미지

답글 남기려 했는데 이미 선수를 빼앗겼군요 OTL

윗분과 같은 생각이고,

printf("%d\n", (2*1024*1024*1024));
printf("%u\n", (2*1024*1024*1024));
printf("%#X\n", (2*1024*1024*1024));
printf("%#X\n", 0x80000000);

힌트를 드리자면 위와 같습니다.
===============================
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

bushi의 이미지

대견하죠.
... 음수를 16진수나 8진수로 적어놓는 정신줄 놓은 코더는 없으리라는 추측에 근거해서
10진수로 적은 것은 signed 로 취급하지만, 그밖의 것은 unsigned 로 취급해줍니다.

#define TWO_GIGA (2*1024*1024*1024U)
#define TWO_GIGA (2*1024*1024*1024UL)
#define TWO_GIGA (2*1024*1024*1024ULL)
처럼 필요하다면 sign 과 type 을 명시적으로 알려주세요.

KILO, MEGA, GIGA 는...

#define KILO(x) ((x)<<10)
#define MEGA(x) (KILO((x)<<10))
#define GIGA(x) (MEGA((x)<<10))
 
#define MAX_SIZE GIGA(2)
 
...
if (gSize > MAX_SIZE) {
  ...
}
...

OTL

tokubetu111의 이미지

여러분 감사합니다.

그럼 디파인할때 상수앞에 타입과 크기를 정해주는건 소용없는건가요?
#define TWO_GIGA (uint32)(2*1024*1024*1024)

위에서 (uint32)는 원래 안먹힌다고 생각하면 될까요?

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

bushi의 이미지

'형변환을 해라' 라는 코더의 요구에 의해 컴파일러는 -2147483648 을 unsigned int 로 형변환하려고 시도했습니다.
변환이야 하겠지만, 이게 정말 니가 의도한게 맞는지 다시 확인하라는 뜻으로 경고를 내보내죠.

코드에 적으신 대로 완전히 잘 먹혀들어갔습니다. 그러니 경고가 나왔죠.
경고를 없애기위해선 -2147483648 이 아니라 2147483648 로 해석하도록 하면 됩니다.
방법은 이미 알려드렸고요.

OTL

tokubetu111의 이미지

백프로 이해할 수 있는, 훌륭한 설명에 감사드립니다.
좋은하루 되세요~

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

[오늘 나의 불행은, 과거 언젠가 잘못 보낸 시간의 보복이다.]

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.