shift 연산자 질문있습니다.

tomas의 이미지

시프트 연산자에서
signed int i=0x40000000 ;
i <<= 1 ;
이렇게 하면 부호자체가 바뀌게 되는데요.
이런 행동이 이식성이 있나요?

익명 사용자의 이미지

32비트 운영체제라면 이식성이 있을것으로 보입니다.

doldori의 이미지

이식성이 없습니다. signed 형에 대해서 E1 << E2의 값이 보장되는 경우는
E1이 음수가 아니고 E1 * pow(2, E2)가 그 signed 형으로 표현 가능할 때뿐입니다.
INT_MAX == 0x7fffffff라고 가정할 때 0x80000000은 INT_MAX보다 크므로
그 결과는 정의되지 않습니다.

tomas의 이미지

먼저 답변 감사드립니다. ^^

>이식성이 없습니다. signed 형에 대해서 E1 << E2의 값이 보장되는 경우는
>E1이 음수가 아니고 E2 * pow(2, E2)가 그 signed 형으로 표현 가능할 때뿐입니다.
E1이 양수이지 않는지요. 0x40000000니까요.
E1*pow(2,E2)는 0x80000000 이라면 ....... 음수값이긴하지만 signed int형으로 표현가능한 값인거 같은데요...

>INT_MAX == 0x7fffffff라고 가정할 때 0x80000000은 INT_MAX보다 크므로
0x80000000은 음수값인데.. INT_MAX 보다 크다는게 이해가 잘 안되네요...

>그 결과는 정의되지 않습니다.

일단 제가 알기로 shift는 유부호 정수형의 양수값에 대해서도 그 결과가 예측가능하다고 알고있는데
0x40000000은 유부호 정수형 signed int의 양수값이므로 이식성이 있지 않을런지여...
아니면, 그 결과까지 양수가 되어야 하는건지...혼동되네요.. :oops:

doldori의 이미지

tomas wrote:
>이식성이 없습니다. signed 형에 대해서 E1 << E2의 값이 보장되는 경우는
>E1이 음수가 아니고 E2 * pow(2, E2)가 그 signed 형으로 표현 가능할 때뿐입니다.
E1이 양수이지 않는지요. 0x40000000니까요.
E1*pow(2,E2)는 0x80000000 이라면 ....... 음수값이긴하지만 signed int형으로 표현가능한 값인거 같은데요...

그것은 0x80000000 비트열을 signed int형에서 어떻게 "해석"하느냐의 문제일
뿐입니다. 제 말뜻은 연산 결과인 0x80000000(십진수로 42억쯤 되죠?)을
singed int로는 표현할 수 없으므로 연산 결과가 정의되지 않는다는 것이었습니다.

tomas wrote:
일단 제가 알기로 shift는 유부호 정수형의 양수값에 대해서도 그 결과가 예측가능하다고 알고있는데
0x40000000은 유부호 정수형 signed int의 양수값이므로 이식성이 있지 않을런지여...
아니면, 그 결과까지 양수가 되어야 하는건지...혼동되네요.. :oops:

음수가 아닌 유부호 정수형에 대해서도 결과가 예측 가능할 때가 있긴 합니다.
단, 처음 답변에서 말씀드린 조건이 충족될 때만 그렇습니다.
참고로 비트 연산은 무부호 정수형으로 하는 것이 좋습니다. 유부호일 때는 지금처럼
여러 가지 신경쓸 일이 생깁니다.

ps. 위에서 E2 * pow(2, E2) --> E1 * pow(2, E2) 로 정정합니다.

cinsk의 이미지

doldori님의 말씀이 맞습니다.

ISO/IEC C 표준(C99)에 따르면, 다음과 같습니다:

Quote:

S 6.5.8.4 The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1
has an unsigned type, the value of the result is E1 * 2^(E2), reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 * 2^(E2) is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

댓글 달기

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