입력스트림은 범위검사를 하지 않나요?

dltkddyd의 이미지

cin으로 키보드 입력을 받아서 값으르 출력해봤더니 초과되는 값에 대한 아무런 검증 없이 그대로 출력이 됩니다. 이상하게도 입력시에 값을 초과하는 값도 모두 허용이 되네요. 문자로 입력을 받지 않고 정수형으로 입력을 받아봤습니다.

#include <iostream>
using namespace std;
 
int main() {
	int i1=0;
	cin>>i1;
	cout<<i1<<endl;
 
 
	return 0;
}

저렇게 해서 컴파일하고 실행한 뒤에

6558984

를 입력하면 cout에서 i1이 6558984로 모두 출력이 됩니다. 저 i1은 정수형이라 양수의 경우 65535까지만 허용이 되야 할텐데, 그렇지 않고 값이 얼마든 허용이 되네요. 저 정수형 i1에 맞게 한계내에서 입력을 받고 싶습니다. 어떤 방법이 있을까요?
그리고 cin은 basic_istream로 선언된 객체이던데요, 저 템플릿 인수에 int를 넣으면 int의 입력을 한계 내에서 받을 수 있지 않을까 했는데, basic_istream이 protected라서 외부에서 사용할 수 없다는 식이네요. 템플릿 인수가 어떤 의미일까요? 그 인수에 대당하는 입력으로 받겠다는 것 아닌니요? 그리고 basic_istream에 템플릿 인수를 직접 넣어서 객체를 선언할 수 있는 방법은 없는지 궁금합니다.

bushi의 이미지

코드에서 i1 의 type 을 unsigned short 로 바꾸신다면,
대부분의 컴파일러에서 원하시는 대로 동작할 겁니다.

dltkddyd의 이미지

답변 덕분에 문제가 해결됐습니다. 그런데 음수를 그 범위에 맞게 입력받는 방법은 없을까요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

unsigned short 로 바꾸셨으니 음수를 입력하더라도 음수로 해석하질 않게 됩니다.

원 질문에서 왜 범위검사를 하지 않는 거냐고 하셨는데, 그건 입력값이 int의 최대 범위를 초과하지 않았기 때문에 입력값이 제대로 받아들여졌고 그대로 제대로 출력된 것입니다. 범위 검사를 제대로 하지 않아서 그대로 출력된 것이 아닙니다.

타입을 unsigned short, short, unsigned int, int, unsigned long, long 등으로 바꾸어 보면서 테스트하고,
입력값을
111111111111111111111111111111111111111111111111111111111111111111
-111111111111111111111111111111111111111111111111111111111111111111
같이 좀더 큰 값으로 해서 각각의 타입에 대해서 어떤 결과가 나오는지 살펴보시기 바랍니다.

dltkddyd의 이미지

일단 해당 문제는 저 윗분이 말씀하신대로 unsigned int 타입으로 입력을 받아서 해결을 했습니다.

그리고 님께서 답변 주신 것은 석연치 않은 구석이 많네요.

111111...
-111111...

저런값을 어떻게 입력하라는 것인가요? 음수 모양이 잘못 됐는데. 기계에서 음수의 경우 맨 앞의 비트는 1입니다. 그리고 저 양수의 형태가 음수가 되죠.. 이상한 답변이군요. 메모리의 내용이 아닌가요? 메모리의 내용이 아닌데 왜 이진수로 답변을 주신것인지. 저거 이진수인가요, 십진수인가요?
여하튼 그 아래 다시 질문드린 것은 int형으로 입력을 받을 때를 말씀드린 겁니다. 답변 주신 내용은 unsigned int로 입력받을 때에 대한 것이지만, 제가 질문드린 것은 int로 입력받았을 때에 대한 것입니다.

int의 양수 범위는 0-65535인데

int integer1;
cin> >integer1;
cout< <integer1;

위와 같은 코드를 컴파일하고 실행한 뒤

65536을 입력하면

음수가 출력될 것으로 예상했는데, 그렇지 않고 65536이 그대로 출력이 됩니다. 저 값을 입력받고자할 때 int형 변수로 입력받는 것은 절대로 해서는 안될까요? 전 저 입력값이 int형으로 해석될 것으로 생각했습니다. 그러면 출력시 분명 음수가 나와야할것으로 봤는데요. 그렇지 않더라는 겁니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

그냥 궁금해서 그런데, 왜 i1이 정수형이라 양수의 경우 65535까지만 허용된다고 생각하시는지 이유를 알 수 있을까요?

dltkddyd의 이미지

32 중에 16비트잖아요. 그쵸? 경우를 따지면 되겠죠.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

정수타입 int이므로 음수 양수를 표현할 수 있고, 32bit 중 16bit는 양수, 나머지 16bit는 음수로 쓰인다는 말씀이신지요?

만약 그렇다면, 죄송한 말입니다만 공부를 처음부터 다시하셔야 합니다. 데이터 타입은 보통 입문서 앞부분에 나온 내용인데, 뭔가 이상한 방향으로 이해하고 계신 거 같습니다. 다시 한번 읽어 보시길 권합니다. 그래도 문제 파악이 안된다면, 주변에 친구나 선생님들의 조언을 받아보시기 바랍니다.

dltkddyd의 이미지

이런 기본적인 것은 물어볼 필요도 없습니다. 그쪽은 컴퓨터에서 0이 어떻게 취급이 되는지 모르시나 봅니다. 수학에서 0과 헷갈리시나 본데, 그렇다면 기초 중에 기초도 모르고 계신 겁니다. 고등학생이라면 모르는게 당연할 겁니다. 그렇다면 초급 입문서 데이터 타입에 대해 다시 공부하셔야 합니다. 수학과 마찬가지로 처음의 개념을 완전히 익히지 않고 대충 알고 넘어가면, 다음 스텝으로 넘어가기가 힙듭니다. 그러니 개념을 확실히 다지면서 공부하시기 바랍니다. 그리고 퀴즈 하나 네겠습니다.

질문]
0은 양수일까요?

해답]
아니라고 대답했다면, 님은 '땡'입니다. 그렇다면 아마도 학생은 수학의 정수 개념과 혼동해서 0을 양수가 아니라고 알고 계신것으로 보입니다. 그렇다면 잘못 알고 계신겁니다. 중학생에게 0이 양수냐고 물어보면 '아니요'라고 대답하는 것이 정상이고, 컴퓨터 전공할 정도의 수준이라면 '네'라고 대답합니다.

질문] 그렇다면 int 타입에서 표현 가능한 양의 정수 범위는 얼마일까요? 맞추면 상을 드리겠습니다.

해답] 너무 간단한 것이므로 자세한 설명은 기본서 첫 부분을 보시기 바랍니다. 이것 하나만 알려드리죠. 양수의 최대값은 음수의 최소값의 절대값보다 1이 작다. 왜 그런지까지 설명하는 것은 c++ 공부하시는 분들은 다 알고 계시는 것이니 생략합니다. 이 정도면 답이 나와야죠.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

위의 익명하고는 다른 익명인데,
잘 모르는 것에 대해서는 말씀을 조심하시는게 좋을 것 같군요.

> 0은 양수이다.

Two's complement 방식으로 정수형을 표현할때,
0의 sign bit가 양수와 같은 0이 된다는 점에서 이런 말을 하시는거 같은데...
그렇다고 0이 양수라고 하지는 않고, 양수나 음수와 다른 0으로 따로 분류합니다.

게다가 컴퓨터의 정수형 표현 방식에 Two's complement만 있는 것은 아닙니다.
C언어 표준에 정의된 방식만 해도
sign and magnitude
ones' complement
two's complement
이렇게 3가지나 되고, 그밖에 표준문서에는 없는 다른 방법들도 있습니다.
이중에 two's complement를 제외한 나머지 두개는
sign bit가 1인 negative zero라는 0의 내부 표현을 사용할 수 있습니다.

물론 그렇다고 0이 음수라고 말하진 않습니다.
그냥 내부 표현이 그렇다는 것이지.
0은 그냥 0입니다.

> int 타입에서 표현 가능한 양의 정수 범위는 얼마일까요?

어떤 기본서를 믿고 이런 말씀을 하시는 것인지는 모르겠습니다만,
역시 간단한 문제가 아니므로 함부로 단정하지 마십시오.

int형의 크기는 명확히 정의되거나 합의되어 있지 않습니다.
일단 정해진 것은 -32767~+32767(32768이 아닙니다)보다 같거나
그보다 큰 범위의 수를 표현할 수 있어야 한다는 것과,
short의 범위와 같거나 그보다 큰 범위를 표현할 수 있어야 한다는 것입니다.
그밖의 사항에 따라서는 implementation이 정하도록 되어 있습니다.

이것과 관련된 문제는 많은 분들이 64bit data model과 관련하여 직접 겪어보셨을 겁니다.
http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

> 양수의 최대값은 음수의 최소값의 절대값보다 1이 작다.

아닙니다. 양수의 최대값은 음수의 최소값의 절대값과 같을 수도 있고, 1이 더 클수도 있습니다.
이 역시 implementation이 정하도록 하고 있습니다.

예전에도 비슷한 말씀을 드린거 같은데...
잘 모르는 것에 대해서 지나친 자신감을 가지고 단언하지 않으시는 것이 좋습니다.
더군다나 그걸 가지고 남을 공격하는데 쓴다는 것은
오히려 자기 자신의 망신이 될 뿐입니다.

익명 사용자의 이미지

> 아닙니다. 양수의 최대값은 음수의 최소값의 절대값과 같을 수도 있고, 1이 더 클수도 있습니다.

오타입니다. "1이 더 클수도"를 "1이 더 작을수도"로 바꿉니다.

dltkddyd의 이미지

누굴 공격했다는 것인가요? 그저 반문일 뿐이죠. 그리고 님의 글에 몇 가진 반론을 들겠습니다.

인용] 양수나 음수와 다른 0으로 따로 분류합니다.

제가 봤던 기본서에서는 0을 양수라고 언급했습니다. 어떤 기본서를 보고 틀렸다고 하는 것인지 모르겠군요. 여하튼 제가 드렸던 질문은 int 타입의 범위가 틀렸다고 하길래 드렸던 답변이었습니다. 저 위쪽의 익명(참 익명하고는 대화하기가 이래서 힘듭니다. 딱히 뭐라 지칭하기가 그렇네요)께서는 0을 제외하고 그 범위를 언급한 것으로 봤던 것으로 보입니다. 0을 포함해서 양수의 범위를 언급한 것이었는데요. 여하튼 0을 포함해서 그 범위가 양수16비트, 음수 16비트라는 것을 말씀드립니다.

인용] Two's complement만 있는 것은 아닙니다.

그렇습니다. 그러나 부호비트에서 음수는 1입니다. 그러나 1의 보수이든 2의 보수이든 사인비트는 1입니다. 기본서를 다시 보시기 바랍니다. 그리고 저 보수 표현 방식은 음수를 표현하기 위한 것입라는 사실을 유념하시기 바랍니다. sign and magnitude는 처음 보는 용어라 저도 잘 모르겠군요. 나중에 시간 되면 살펴봐야 하겠습니다. 저것에 대한 사인비트는 저도 모릅니다. 처음 보는 용어이니까요. 그건 제외하고 말씀드린 겁니다.

인용] int형의 크기는 명확히 정의되거나 합의되어 있지 않습니다. 일단 정해진 것은 -32767~+32767(32768이 아닙니다)보다 같거나 그보다 큰 범위의 수를 표현할 수 있어야 한다는 것과, short의 범위와 같거나 그보다 큰 범위를 표현할 수 있어야 한다는 것입니다.

플랫폼에 따라 정수형의 범위는 물론 달라질 수 있습니다. 어떤 컴에서는 4바이트 정수형이 다른 컴퓨터에서는 아닐 수도 있겠죠. 제가 언급한 것은 4바이트 정수형에 대해 언급한 것입니다. 그건 일종의 전제였다는 것을 상식있는 사람들은 글 보면 압니다. 그리고 제가 앞서 실수한 부분이 있긴 하군요. 2로 음수와 양수의 범위를 쪼개고 그 범위를 계산해야 한다는 것을 깜빡했군요.
다시 4바이트를 기준으로 설명드리겠습니다.

1의 보수인 경우는 그 범위가
-32767[-(2^15-1)]~32767[2^15-1]
2의 보수인 경우는 그 범위가
32768[-2^15]~32767[2^15-1]

입니다. 1의 보수는 0 되는 값이 두 개이죠

00000000 00000000 00000000 00000000(이진수)도 0이고
11111111 11111111 11111111 11111111(이진수)도 0입니다.

그리고 2의 보수는 0이 하나가 되겠죠. 그래서 1의 보수는 음수의 범위의 개수가 2의 보수 표현에 의한 음수의 범위보다 하나 적습니다. 본인도 다 아는 사실입니다. 그런데 제가 최초에 질문 드린 건 이런 범위에 대한 것이 아니었죠. 저 익명과 지금 글 올리신 익명이 계속 질문과는 다른 쪽의 반문을 하는데, 저 질문을 한 거지 답변 달려고 질문 한게 아니죠.
아무래도 님은 아마 저 위쪽 익명과 무슨 관계가 있든지 그 익명인 것으로 보입니다. 그렇지 않다면 공격이랄 것도 없는 비판을 갖고 빈정상할 이유가 없을텐데요. 여하튼 이 판단은 본인의 양심에 맞겨야겠죠. 그런것까지 제가 알 필요는 없지 않겠어요. 그래서 님이 아니든 그렇든 별 상관없습니다. 전 별로 익명을 인간으로 취급하지 않기 때문에 그렇습니다. 익명이 답변 다는 것에 대해서도 별 기대를 하지 않습니다. 별 도움이 안 되거든요. 도움 받을 생각도 안 합니다.
그리고 무슨 공격을 했다는 것인지. 설사 그게 공격이라고 할지라도 님한테 한 것도 아니죠. 저 익명말입니다. 자신의 인격을 먼저 살펴보고 지적질을 해야 하는 것입니다. 책에서 남들이 일반적으로 알 것이라 생각하는 것에 대해서는 전제를 생략하기도 합니다. 그런 정도의 수준은 돼야 하는 것입니다. 의원이 병자를 고치려면 적어도 의원이 병자들 돌볼 수 있는 기초적인 체력을 갖추어야 하듯이 남의 들보를 빼려면 자신의 들보를 먼저 빼야 하는 것입니다. 병에 걸린 의원이 환자를 돌볼 여력이 있을지 생각해보세요. 그리고 환자도 아닌 사람을 환자로 오인하는 의원은 정상인에게조차 해가 될 수 있으니 피하는 것이 좋습니다. 답글다운 답글을 달만큼의 충분한 지식이 없다면 답글을 안 올리는 것이 낫겠죠. 또한 도움을 청하는 글에 쓸데없이 시비거는 것은 좋은 일도 아닙니다. 남도 기본적으로 다 아는 사실을 자신만 안다고 생각하는 교만 역시 버려야 하겠습니다.
여하튼 덕분에 예전에 공부했던 것 스스로 기억더듬어가면서 좋은 복습했습니다. 그 점을 감사드려야 겠군요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

for the record

익명 사용자의 이미지

그렇습니다. 그러나 부호비트에서 음수는 1입니다. 그러나 1의 보수이든 2의 보수이든 사인비트는 1입니다. 기본서를 다시 보시기 바랍니다. 

음... 이 얘기는 위의 논의에서 나온적이 없는데
대체 왜 갑자기 꺼내고, 그걸 가지고 기본서를 보라 마라 하시는지 모르겠는데...
C에서 가정하고 있는 3가지 정수형 표현 방법에서는 음수의 sign bit가 1이지만
모든 정수형 표현 방법에서 그런 것은 아닙니다.

남들이 댁보고 기본서를 보라니까 그거 배워서 그대로 기본서 타령하는 것 같은데...
어떤 기본서를 보라고 하는 것인지 책 이름이나 한번 불러 보시겠습니까?
저런 내용 적혀있는 기본서 공부한 적이나 있어요?

저 보수 표현 방식은 음수를 표현하기 위한 것입라는 사실을 유념하시기 바랍니다.

제가 위에서 제시한 세가지 모두 음수를 표현하기 위한 방법들입니다.
음수를 표현하는데 반드시 보수 개념을 써야 하는건 아닙니다.

제가 언급한 것은 4바이트 정수형에 대해 언급한 것입니다. 그건 일종의 전제였다는 것을 상식있는 사람들은 글 보면 압니다. 

저 i1은 정수형이라 양수의 경우 65535까지만 허용이 되야 할텐데, 

32 중에 16비트잖아요. 그쵸? 경우를 따지면 되겠죠.

다시 4바이트를 기준으로 설명드리겠습니다.
 
1의 보수인 경우는 그 범위가
-32767[-(2^15-1)]~32767[2^15-1]
2의 보수인 경우는 그 범위가
32768[-2^15]~32767[2^15-1]

남들이 혼란을 느끼는 이유는, 당신의 말이 4바이트 정수형을 가정한 상황과는 동떨어져 있고,
따라서 일반적인 상황과도 동떨어져 있으며,
자신이 하는 말 사이에도 모순이 있기 때문입니다.

남들도 보면 딱 알죠. 댁이 전혀 모르는 것에 대해 아는 것처럼 말한다는 것을.

dltkddyd의 이미지

그쪽의 말은 일고의 가치도 없다는 사실 기억하시길 바랍니다. 저 이야기는 제가 꺼낸것이 아니라 댁같은 익명이 꺼낸놓은 것입니다. 제대로 된 답변은 할줄도 모르면서 이러쿵 저러쿵 하는 것은 그쪽이 했지. 물어보길래 답변할 것 뿐이고. 여하튼 님같은 놈들하고 시간낭비할 시간 없고, 만약 잘 모르겠거든 인터넷 뒤져서 제대로 알고 답변하시길 바래. 어떻게 사인비트가 1이 아니라는 말을 할 수가 있지. 기본 중에서도 기본도 안 된 놈들이 프로그래머랍시고 깐죽거리는 꼴을 정말 못 보겠군. 기본서 보라고 한 것도 그쪽이 먼저 했지. 익명은 자신의 무식을 감추기 위한 하나의 방편이겠지. 여하튼 사람 아니라니까. 얼마나 독서량이 부족하면 전제가 뭔지 알아채지 못하는 저 센스를 뭐라 할까.
1의 보수인 경우

-32767[-2^15+1]~32767[2^15-1]

이 되겠군.

그리고 부호비트가 1이라는 것은 2의 보수를 전제로 했을 때를 말하는 것이지. 또 헛다리 짚으셨네. 몰라도 너무 몰라.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

qiiiiiiiip의 이미지

$ cat a.c
#include <stdio.h>
#include <limits.h>
 
int main()
{
    printf( "%lu %d %d %u\n", sizeof(short), SHRT_MAX, SHRT_MIN, 0xffff );
    printf( "%lu %d %d %u\n", sizeof(int), INT_MAX, INT_MIN, 0xffffffff );
    return 0;
}
 
$ gcc -Wall a.c
 
$ ./a.out
2 32767 -32768 65535
4 2147483647 -2147483648 4294967295

C에서 가정하고 있는 3가지 정수형 표현 방법에서는 음수의 sign bit가 1이지만
모든 정수형 표현 방법에서 그런 것은 아닙니다.
dltkddyd의 이미지

정수형 중에 unsigned가 아닌 타입은 0을 논위로 한 음수의 부호비트가 1이죠. 정수형 중에 int, short int, long int, long long int 말입니다. unsigned는 해당 부호비트의 논의에서 제외됩니다. 그런데 제가 처음에 질문 드린 건 이게 아니었는데. int 타입의 변수로 음수를 제대로 입력을 받고 싶다는 겁니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

qiiiiiiiip의 이미지

4 2147483647 -2147483648 4294967295

이걸 왜 보여드렸는지 생각해보세요.

dltkddyd의 이미지

4바이트군요. 그럼 그 범위는 이렇게 됩니다.

1) 2의 보수의 경우
2^31~2^31-1

2) 1의 보수의 경우
2^31+1~2^31-1

4바이트를 16비트로 계산해버렸네요. 제 실수입니다. 혹시 제가 32비트를 반으로 쪼갠 것이 32/2로 생각했다고 보신건 아니겠죠. 제가 잘못 봤네요. 4바이트는 32비트이죠. 아마도 다른 작업 하면서 답하느라 말이 헛나왔군요. 31제곱이 되는 이유는 절반은 (2^32)/2이기 때문이죠. 65535라고 했으니 32를 2로 나눈 것으로 생각하신 거군요. 정정합니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

댁에게 싸움이나 걸려고 내가 귀한 시간 쪼개 리플 달고 있다고 생각하면 아주 곤란합니다.
잘못된 정보를 마치 옳은 것인양 당당하게 횡설수설하고 있으니까 그걸 바로잡은 것일 뿐.
댁이 한 헛소리를 그냥 놔두면 누군가가 나중에 검색기 타고 들어와서 보고는 KLDP에서 누가 그러던데? 하는 사람이 분명히 생긴단 말입니다.

그리고 뭔가 착각하고 있는거 같은데 여긴 개인 블로그가 아니라 공개된 게시판이고 누구나 의견을 게시할 수 있어요.
익명이 어쩌고 헛소리 할려면 댁이 직접 사이트 만들어서 왕처럼 놀던지 하시고.

태클 받기 싫으면 얌전히 답변이나 받아가요.
알지도 못하는 것에 자꾸 아는척하고 헛소리를 하니까 자꾸 다른 사람들이 한소리씩 하게 되고,
그게 싫어서 또 별의 별 헛소리랑 변명을 계속 늘어놓고...

dltkddyd의 이미지

제가 실수했군요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

음..

님은 남들 다 아는 사실을 자신만 모른다는 걸 아셔야 할 것 같은데요.

kaeri17의 이미지

컴퓨터 전공 운운해서 궁금해 졌는데 글쓰신 분은 컴퓨터 전공하고 있는건가요?

익명 사용자의 이미지

딱 보면 몰라요?

남들 쉽게 가는 길 어렵게 간다잖아요ㅋ

기본적인 내용도 혼자 소화 못하고 게시판에서 하나 하나 배우는 주제에, 태도까지 저러니.. 어렵긴 참 어려워 보이네요.

kaeri17의 이미지

???????????????????????????????????????????????????????????????????????????????

dltkddyd의 이미지

농담이었습니다. 간혹 유니코드가 컴에서 ?로 깨지는 경우가 있길래요. ?로 깨져도 늘 항상 진리가 머물기를 기대합니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

2진수로 음수를 표현하는 방법은 여러가지가 있지만, 주로 사용되는 것이 2의 보수입니다.
2의 보수는 최상위 비트를 부호 비트로 사용함으로써 음수를 나타내는 방법입니다. (양수 혹은 음수만을 표현하면 되므로 1비트만 할당합니다.)

2의 보수를 구하는 방법은 아래와 같습니다. 예로 들 수는 4Byte 자료형(편의상 4Byte로 합니다)의 6입니다. (6은 이진수로 0110입니다.)
1. 각 자리의 비트를 전부 반전시켜줍니다. (0은 1로, 1은 0으로) => 1001
2. 1을 더합니다. => 1010

왜 이렇게 복잡한 방법을 사용하느냐? 하면 회로가 간단해지기 때문입니다.

4Byte의 자료형에 저장되어있는 3과 -3을 더한다고 합시다. 3+(-3)은 상식적으로 0이라는 것을 알 수 있습니다.
하지만 맨 앞 부호를 단순 음수로만 생각하여 0011+1011과 같이 계산하면 0이 아닌 1110과 같이 해괴한 수가 나옵니다.

이 때 2의 보수를 사용하여 구하면 다음과 같습니다.
0011
+1101
-----
10000 (* 4Byte의 자료형이므로 맨 앞의 1은 오버플로우로 없어지게되어 0000이 남습니다.)

2의 보수를 사용함으로써 계산 값이 0이 되어 원하는 결과를 쉽게 얻을 수 있습니다.

보수법으로 10진수와 2진수를 비교하면 아래와 같습니다. 8~64비트가 일반적이나 편의상 자료형은 4비트로 생각합니다.

10진수 2진수
7 0111
6 0110
5 0101
4 0100
3 0011
2 0010
1 0001
0 0000
-1 1111
-2 1110
-3 1101
-4 1100
-5 1011
-6 1010
-7 1001
-8 1000

32비트의 정수형에서도 원리는 같습니다.

32비트의 최 상단 비트는 부호 판단 비트로 사용하며, 나머지 31비트는 값을 나타내는데 사용하게 됩니다. (unsigned자료형이면 32비트 모두 값을 나타냅니다.)

따라서 32비트의 부호있는 정수형으로 표현 가능한 범위는 -2,147,483,648 ~ 2,147,483,647로 6,558,984라는 값을 저장하는데 무리가 없습니다.

익명 사용자의 이미지

여러 전문가 앞에서 잘못알고 있는 것을 진리인양 떠들고, 이를 지적하는 것에 대해서 공격한다느니 제대로 알고 오라느니..
제가 보기엔 당신이 제일 모르는것 같군요
제 생각만은 아닌것 같구요

지금 쓰는 글들을 봐서는 현업에서 일할 수준은 절대 안되는 것 같지만 혹시 일을 하고 있거나 추후에 하게 된다면 주변 분들이 걱정입니다.

댓글 달기

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