char / short 의 형변환

jee89의 이미지

char / short 타입들이 수식에 쓰이면
int로 변환되어서 계산이 되어지나요?

char a;
short int b;
int c;

c = a + b;
라고 할때 1byte인 a가 내부적으로 4바이트로 바뀌고
2byte인 b가 내부적으로 4바이트로 바껴서 계산되어서
int c에 들어가게 되나요?

수식에서 char / short ---> int ( 4 bytes로 부호확장) 이 일어나나요?
다른 형에서도 이런 확장이 일어나는경우가 있나요?

송지석의 이미지

컴파일러 마다 틀릴 것 같은데...

일단 먼저 +가 계산 되고 =연산이 될 것 같군요.

short로 먼저 캐스팅이 될것 같은데요..

그런데 저렇게 하면 오류 나지 않나요?

먼저 short가 나오고 char를 더하면 괜찮지만

char 다음에 short를 더하면 캐스팅 하라고 나올 것 같은데..

lightwind의 이미지

해당언어가 C라는 전제하에 말씀드립니다.

C에서 char형은 연산에 참여할때 자동으로 int형으로 변환됩니다.

따라서 char + short 또는 char / short는 int 형으로 자동캐스팅되며 연산결과도 int형이 됩니다.

참고로
short = char + short 의 경우를 가정하면 int 형이 short형으로 대입되므로 손실변환이 발생하므로 경고가 나옵니다.
int = char + short경우를 가정하면 int = int 이므로 변환과정이 없습니다.

단, char형이 int 형으로 변환될 경우 문자형 변수가 signed일지 unsigned일지는 표준에 정의되지 않은 관계로 기계마다 다르게 됩니다만, ASC-II 문자세트의 경우 어떤 글자도 음수가 될 수 없기 때문에 상관없이 사용하셔도 됩니다.

그러나 이기종 간에 서로 다른 언어로 작성된 프로그램간에 인터페이스를 작성하실 예정 - 예전에는 주로 메인프레임 때문에 이짓을 했지만 - 이라면 명시적 형변환을 통해서 signed 또는 unsigned 시켜 주셔야 하지만 .. 쩝.. 요즘 메인프레임 프로그램을 하는 경우는 거의 없으므로.. 아마도 없겠지요.

jee89의 이미지

lightwind wrote:
해당언어가 C라는 전제하에 말씀드립니다.

C에서 char형은 연산에 참여할때 자동으로 int형으로 변환됩니다.

따라서 char + short 또는 char / short는 int 형으로 자동캐스팅되며 연산결과도 int형이 됩니다.

참고로
short = char + short 의 경우를 가정하면 int 형이 short형으로 대입되므로 손실변환이 발생하므로 경고가 나옵니다.

답변 감사드립니다.
1)그런데 다시 질문드립니다.
C++인경우에 char / short가 연산에 참가시 int형으로 자동형변환되는
경우가 적용되지 않나요?
2)

#include <stdio.h>

int main()
{
  short s = 8;
  char  a = 3;
  short c ;

  c = a + s;
  printf( "c [%d]\n" , c );
}

--------------결과
c [11]
--> 컴파일시 경고가 발생하지 않군요^^

3) 마지막으로 float(4bytes)가 double형으로도 자동형변환이 되나요?

arimae의 이미지

Quote:
1)그런데 다시 질문드립니다.
C++인경우에 char / short가 연산에 참가시 int형으로 자동형변환되는
경우가 적용되지 않나요?

제 기억이 맞다면 C++ 도 마찬가지로 연산시 int 형으로 자동형변환이 되는것으로 알고 있습니다.

Quote:
2)
코드:
#include <stdio.h>

int main()
{
short s = 8;
char a = 3;
short c ;

c = a + s;
printf( "c [%d]\n" , c );
}

--------------결과
c [11]
--> 컴파일시 경고가 발생하지 않군요^^

이건 저도 정확히 모르겠군요.
테스트를 위하여 처음에는 작은 데이터형을 큰 데이터형으로 저장해서 경고가
발생하지 않는 것으로 생각하였으나 생각해보니 결국 오른쪽의 int 형을 왼쪽의
short에 저장하게 되는군요. c 변수를 char로 선언해도 마찬가지 결과가
나옵니다. (VS 6.0, gcc, C++ Builder 전부) 그래서 내린 결론이 char, int,
short의 경우 명시적인 형 변환을 해주지 않아도 대입시에 컴파일러가 특별한
경고를 출력하지 않고 그냥 허용하는것 같습니다. 물론 int를 short나 char에
저장하였다면 데이터 손실의 가능성은 존재하겠지만, 그냥 무시하는 것 같습니다.
부동소수형과 정수형간의 대입은 경고를 출력하는 군요.

Quote:
3) 마지막으로 float(4bytes)가 double형으로도 자동형변환이 되나요?

예. 역시 계산의 정확도를 높이기 위해 내부적으로 double 형으로 변환하여
계산후 float으로 변환하여 저장합니다.

Dream, Passion and Challenge..

익명 사용자의 이미지

음....

계산수식에 참여하는 요소중에서 가장 큰 type으로 캐스팅되어 계산됩니다.

그리고 부동소숫점이 있다면 부동소숫점이 우선순위로

부동소숫점으로 캐스팅 됩니다.

그리고 int보다 작은 정수값의 캐스팅은 int로 변환을 합니다.

하지만 최종 타겟이 int보다 작은 타입라면 보정하여 계산합니다.

증명하기 위해 이것이 가장 적절할듯 합니다.

참고로 작은데이터 형이 큰 데이터 형으로 변환될때는 값의 손실이 없습니다.

단, signed와 unsigned 간의 캐스팅은 문제가 있습니다.

lightwind의 이미지

C++의 기본데이터형은 C의 표준과 호환되도록 명시되어 있습니다.

]]--------------결과
]]c [11]
]]--> 컴파일시 경고가 발생하지 않군요^^

이 경우 보통 옵티마이저를 조절하면 경고를 볼 수 있습니다.
옵티마이저를 조절하지 않으셔도 a = 254 정도의 값으로 크게 대입하시면
경고를 볼 수 있을 겁니다.

float는 정밀도때문에 더블로 계산된 뒤 다시 치환되도록 컴파일러에 의해 조정이 됩니다. 이것은 형변환과 관계가 없고 단지 컴파일러에 의해서 제공되는 것입니다. 물론 표준에 모든 부동 소수 연산은 double로 이루어지도록 권고된 사항이기 때문입니다.

arimae의 이미지

Quote:
C++의 기본데이터형은 C의 표준과 호환되도록 명시되어 있습니다.

]]--------------결과
]]c [11]
]]--> 컴파일시 경고가 발생하지 않군요^^

이 경우 보통 옵티마이저를 조절하면 경고를 볼 수 있습니다.
옵티마이저를 조절하지 않으셔도 a = 254 정도의 값으로 크게 대입하시면
경고를 볼 수 있을 겁니다.

실제로 해보니 gcc와 C++ Builder는 경고를 출력하지 않는군요.
gcc에서 최적화 레벨이나 -Wall 로 경고를 출력하게 하여도 경고는 출력하지 않습니다.
VS 6.0 에서 컴파일 해보니 VS는 경고를 출력합니다.
이것은 표준이 정해지지 않고 컴파일러만 알아서 구현하라고 하였기 때문일까요?
다른 컴파일러에서도 char a 에 255를 넘어가는 값을 대입하였을 경우에는 경고만 발생하는군요.
제 생각에 VS를 제외하고는 데이터 손실이 없는 경우는 특별한 경고를 출력하지 않는것 같습니다.

p.s. gcc 의 version은 2.95.3 입니다. Builder는 5.0 이구요.

Dream, Passion and Challenge..

댓글 달기

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