이식성이 없습니다. signed 형에 대해서 E1 << E2의 값이 보장되는 경우는
E1이 음수가 아니고 E1 * pow(2, E2)가 그 signed 형으로 표현 가능할 때뿐입니다.
INT_MAX == 0x7fffffff라고 가정할 때 0x80000000은 INT_MAX보다 크므로
그 결과는 정의되지 않습니다.
>이식성이 없습니다. 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:
>이식성이 없습니다. 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) 로 정정합니다.
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.
32비트 운영체제라면 이식성이 있을것으로 보입니다.
32비트 운영체제라면 이식성이 있을것으로 보입니다.
이식성이 없습니다. signed 형에 대해서 E1 << E2의
이식성이 없습니다. signed 형에 대해서 E1 << E2의 값이 보장되는 경우는
E1이 음수가 아니고 E1 * pow(2, E2)가 그 signed 형으로 표현 가능할 때뿐입니다.
INT_MAX == 0x7fffffff라고 가정할 때 0x80000000은 INT_MAX보다 크므로
그 결과는 정의되지 않습니다.
먼저 답변 감사드립니다. ^^>이식성이 없습니다. signe
먼저 답변 감사드립니다. ^^
>이식성이 없습니다. 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:
[quote="tomas"]>이식성이 없습니다. signed 형에
그것은 0x80000000 비트열을 signed int형에서 어떻게 "해석"하느냐의 문제일
뿐입니다. 제 말뜻은 연산 결과인 0x80000000(십진수로 42억쯤 되죠?)을
singed int로는 표현할 수 없으므로 연산 결과가 정의되지 않는다는 것이었습니다.
음수가 아닌 유부호 정수형에 대해서도 결과가 예측 가능할 때가 있긴 합니다.
단, 처음 답변에서 말씀드린 조건이 충족될 때만 그렇습니다.
참고로 비트 연산은 무부호 정수형으로 하는 것이 좋습니다. 유부호일 때는 지금처럼
여러 가지 신경쓸 일이 생깁니다.
ps. 위에서 E2 * pow(2, E2) --> E1 * pow(2, E2) 로 정정합니다.
doldori님의 말씀이 맞습니다.ISO/IEC C 표준(C99)
doldori님의 말씀이 맞습니다.
ISO/IEC C 표준(C99)에 따르면, 다음과 같습니다:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기