2013-08-07 2 views
-4

부호없는 데이터 유형은 언제 사용해야하며 서명 된 데이터 유형은 C? 그리고 나는 왜 우리가 그것을하는지, 그리고 우리가 필요한 것을 결정하는 방법을 알고 싶습니다.부호없는 데이터 형식을 사용하는 경우?

+4

당신이 http://stackoverflow.com/questions/247873/signed-versus-unsigned-integers –

+0

너무 광범위한 질문을 갈 참조하십시오. 그리고 건설적인 것도 아닙니다. FAQ를 읽어보십시오. – yulian

답변

4

음수 값을 포함하도록 변수를 사용해야하는 경우 부호가있는 데이터 유형을 사용하십시오. 부호있는 정수 오버 플로우로 인해 정의되지 않은 동작이 발생하므로 오버플로에주의하십시오.

변수가 음수가 아닌 값 또는 비트 패턴 만 보유하고있는 경우 부호없는 데이터 유형을 사용하십시오. 일반적으로 동일한 크기의 서명 된 데이터 유형보다 더 높은 최대 값을 보유 할 수 있습니다. 부호없는 정수 오버플로가 순환합니다.

0

귀하의 가치가 항상 긍정적이라는 점을 확신 할 때마다 unsigned int을 사용해야합니다. 또한 unsigned int의 최대 값은 2^32 - 1이며 첫 번째 비트가 부호를 지정하므로 부호가있는 int의 최대 값은 2^31 - 1입니다.

+1

"부호없는 int의 최대 값은 2^32 - 1입니다."- 아니요, 필요하지 않습니다. –

+3

부호없는 값입니까? 예! 확실합니까? 나는 긍정적이다! – Jiminion

+0

@ H2CO3 ... 뭐라고 요? – gr3co

0

unsigned은 정말 기호의 개념이없는 엔티티에만 사용해야한다고하는 생각이 있습니다 (제가 자주 고수하려고합니다). 예를 들어, 기계 상태 레지스터에서 각 비트는 의미를 가지지 만 레지스터 값 전체에는 가능한 부호가 없습니다. 따라서 그러한 값에는 unsigned를 사용해야합니다.

나머지 모든 내용은 signed을 사용하십시오.

unsigned의 문제점은 부호있는 값과 함께 산술적으로 사용할 때 컴파일러에서 일부 변환을 수행해야한다는 것입니다. 이것들은 비 직관적 일 수 있으며 부정확하거나 예기치 않은 산술 결과를 초래할 수 있습니다. 다음은 주제에 관한 작은 기사입니다. http://soundsoftware.ac.uk/c-pitfall-unsigned

표준 라이브러리가 표준 라이브러리를 따르지 않는 것이 문제입니다. 많은 함수는 size 매개 변수 (예 : strncpy)를 사용하거나 size_t (예 : strlen)의 size (부호 없음)을 반환합니다. 이것이 서명되지 않은 논리는 프로세서의 최대 주소 공간까지 크기를 허용한다는 것입니다.

그래서 걸릴 최고의 라인이 무엇인지 혼란 스럽습니다. 컴파일러는 기호 변환을 경고 할 수 있습니다 - 여기 https://www.gnu.org/software/gsl/manual/html_node/GCC-warning-options-for-numerical-programs.html

+0

불행히도 C의 동작은 일관성있는 이론적 근거에 의한 것보다 편의에 의해 주도 된 것 같습니다.대부분의 상황에서 부호없는 유형은 숫자로 동작하지 않고 대신 추상 대수 링의 멤버를 나타냅니다. 서명 된 int를 부호없는 int에 추가하면 부호없는 int가 생성되어야한다는 논리에 따라 부호없는 short에 부호가있는 long을 추가하면 부호가없는 short가 생성되어야한다는 명령이 내려집니다. 물론 그렇지 않습니다. – supercat

관련 문제