char -> long 으로 케스팅이 안되내요

pooshap의 이미지

32bit intel cpu에 linux(2.4.20)에 gcc 3.2.2 를 쓰고 있습니다.

main()
{
const char *k="2147483648";
long chat_1;
long chat_2;

chat_1 = 2147483648; //2^31
chat_2 = atol(k);

printf("%d %u\n",chat_2,chat_1);
}
실행을 했을경우

[root@db love]# gcc -o k k.c
k.c: In function `main':
k.c:18: warning: decimal constant is so large that it is unsig

[root@db love]# ./k
2147483647 2147483648

첫번째는 : 18줄에 왜 warning이 나는지
long의 크기는 4byte이구요 unsigned long으로 해도 warning이 발생되내요.

두번째는 캐스팅이 역시나 안되내요.
제가 보기에는 2^31-1 까지의 한계가 있는거 같습니다.
왜 그런지요...

charsyam의 이미지

아마도 그게 gcc 버그일껍니다. 2^31 까지가 제대로 표현이 안되죠.

그 때, 꽁수로 해결한것 같은데...

먼저 인식할 수 있는 값까지만 넣고, 나머지 값을 더해 버리세요 ^^
이런식으로 하면 그 값이 들어가도록 만들 수 있습니다.

음... 생각해보니... 대충... 비트 연산을 해줘도 되겠네요

=========================
CharSyam ^^ --- 고운 하루
=========================

익명 사용자의 이미지

2147483648 -> 2147483648U

꽁수 아닙니다. 8)

shkwon81의 이미지

Quote:

chat_1 = 2147483648; //2^31
chat_2 = atol(k);

아래는 리눅스 2.4의 <limits.h>에서 발췌한 내용입니다.

#  if __WORDSIZE == 64
#   define LONG_MAX 9223372036854775807L
#  else
#   define LONG_MAX 2147483647L
#  endif

보다시피 워드 크기가 32비트인 경우는 최대값이
2147483647 입니다.
또한 long을 의도하셨다면 숫자의 끝에 꼭 L 또는 l을 써 주세요.

따라서,
2147483648L 처럼 쓰시는 게 맞습니다.
물론 LONG_MAX는 2147483647L 이므로 역시 표현 범위를 벗어납니다.

LONG_MAX의 크기가 2^31 - 1 인 이유는 잘 생각해 보시면 당연합니다.
0과 음수의 범위도 생각하셔야 겠지요 ^^

2의 보수 표현을 사용하는 시스템의 경우는 대부분,
32비트 부호 있는 정수는

(-2^31) ~ (2^31 -1)

의 범위를 가집니다. (그리고 우리가 접할 수 있는 컴퓨터 대부분은
2의 보수 표현을 사용합니다.)

charsyam의 이미지

아, 버그였던게, 2.x 버전이었던거 같은데, 하여튼 L 을 붙여도 되지 않는

버전이 있습니다. 음... 정확하게 기억이 안나네요. 그 때는, 적당히 더해서

만들었거든요. ^^, 잘못된 정보를 드려서 죄송합니다. ^^ 그럼 고운 하루

=========================
CharSyam ^^ --- 고운 하루
=========================

익명 사용자의 이미지

Quote:
2147483648L 처럼 쓰시는 게 맞습니다.
물론 LONG_MAX는 2147483647L 이므로 역시 표현 범위를 벗어납니다.

long 범위를 벗어난 상수에 L을 붙이는 것은 의미가 없습니다. U를 붙여야 맞습니다.
charsyam의 이미지

틀릴것을 가르쳐 주셔서 감사합니다. ^^ 앞으로도 틀리거나 모르는 걸

고쳐주시면 정말 고맙겠습니다. ^^ 그럼 고운 하루되세요.

ps. 하시는 프로젝트도 잘되면 좋겠습니다. ^^

=========================
CharSyam ^^ --- 고운 하루
=========================

pynoos의 이미지

printf 안의 format과 인자로 넘어가는 변수명은 타입이 일치하지 않을경우 warning이 납니다. 크기와는 상관없습니다.
게다가 크기가 일치 하지 않을 경우 이상하게 표기되며 자칫 segment fault가 되기도 하지요.

hd,hu
d, u,
ld, lu
lld, llu

를 확인해 두세요..

man 3 printf

vim 에서는 printf 위에서 3을 누르고 K (대문자)를 누르면 되겠죠.

댓글 달기

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