<PRE>int main(void){char a=127;printf(\"%d\",a<<1);return 0;}에서 127은 01111111 이라서 <<1연산을 하면 11111110가 나와야 되는 것 같은데 내 생각이 맞는거에요?
그리고 값은 254가 나오는데 왜 이런 값이 나온 거죠 ? 글구 char은 127까지 나타내는데 왜 이렇게 나오지 %d 대신에 다른 걸 써야 되는건가요?</PRE>
그리고 값은 254가 나오는데 왜 이런 값이 나온 거죠 ? 글구 char은 127까지 나타내는데 왜 이렇게 나오지 %d 대신에 다른 걸 써야 되는건가요?</PRE>
11111110 (2) = 254 (10)인데 뭐가 왜 그런값이 나오냐는거야
맨 앞의 자리는 부호를 나타내는 건데 1이 나오니까 음수가 나와야 되는 거 아닌가요? 저 값은 -128을 나타내는 것이 아닌가요?
스택이 뭔지 공부한 담에 역어셈해보센.. 그럼 왜 그런지 알 수 있을거임.
인자를 넘기기 위해 스택에 집어넣으려는 순간 a<<1는 더이상 1byte signed char가 아니게 됨
감사요. 더 공부를 해야 알 수 있겠네요. 128을 넣으면 -256이 나오는데 이것도 자연스러운 것이고, 더 공부하면 알게되는 건가요?
ㅇㅇ좀 더 자세히 설명하자면, 함수 호출 시 인자를 넘길때에는 스택이란 공간에 쑤셔넣어서 넘겨주는데, 1byte크기인 char를 스택에 쑤셔넣더라도 4byte공간을 할당하게 됨.
127은 16진수로 0x7f. 이게 스택에 넣는 과정에서 4byte로 확장되면 0x0000007f. 이게 쉬프트되면 0x000000fe가 되어서 254가 되고
128은 16진수로 0x80인데, 이걸 스택에 넣기 위해 4byte로 확장할때에는 char가 부호있는 자료형이기 때문에 부호를 나타내는 최상위비트가 같이 확장되어 0xffffff80으로 바뀜. 여기서 쉬프트하면 0xffffff00이고 이걸 2의보수법으로 다시 표현하면 -256이 됨.
베리베리 감사요... 무슨 말인지 아직 이해는 안 되는데 공부 더 하다가 보면 되겠죠. 다시 한 번 감사효
11111110은 -2 아님?
ㄴ ㅎㅎ 글쿤요;;
일단 printf에서 \'a<<1\' 이 부분을 \'(char)(a<<1)\'이렇게 바꾸면 대충 뭔 소린지 이해가 갈거임. 쉽게말하자면 정수로 자동 형변환돼서 그런거임.