'uint'및 'short'데이터 유형이 표준 int (32)보다 더 적합한 경우는 무엇입니까?


24

나는 그들이 나타낼 수있는 용량과 가치의 차이를 이해하지만 그것이 적절한 지 여부에 관계없이 사람들이 항상 사용 하는 것처럼 보입니다 Int32. uint음수가 될 수없는 값 (데이터베이스 레코드의 ID를 나타낼 수 있음)을 설명 할 때 많은 시간이 걸리더라도 서명되지 않은 버전 ( ) 을 사용 하는 사람은 없습니다. 또한 short/Int16필요한 가치의 용량에 관계없이 아무도 사용하지 않는 것 같습니다 .

객관적으로 더 나은 사용의 경우,이 경우는 uint또는 short/Int16그렇다면, 그들은 어떤입니까?


13
인기는 소프트웨어 설계 결정을 평가하는 데 항상 유용한 지표는 아닙니다. 연습이 인기가 있다고해서 특정 응용 프로그램에 적합한 연습이거나 좋은 연습이라는 의미는 아닙니다.
Robert Harvey


1
짧은 대답은 프로그래머가 서명 된 의미론에 익숙해 져서 서명되지 않은 유형 (따라서 서명되지 않은 의미론)을 다룰 때조차도 그렇게 생각하는 경향이 있다고 생각합니다. 대부분의 사람들은 프로그래머가 게 으르거나 교육을받지 않은 것이 문제라고 생각하지만 문제의 프로그래머는 실제로 교육을 받고 매우 신중하며 미묘한 함정을 피하기를 원합니다. 원하는 경우 soundsoftware.ac.uk/c-pitfall-unsignedanteru.net/2010/05/17/736을 살펴 보십시오 .
Theodoros Chatzigiannakis

부호없는 숫자에서 부호는 null양수 또는 음수 이상입니다. 부정적이지 않거나 항상 긍정적 인 것으로 생각하면 결과에 놀랍니다 (종종 화나게 할 것입니다). 부호있는 값에서.
Adam D. Ruppe 2014

1
내 경험상 C 언어로 프로그래밍 한 많은 프로그래머는 여전히 요즘 GB의 메모리 및 저장 공간에 대해 관심이 있습니다.
user1451111

답변:


25

나는 당신이 적분 유형을 올바르게 사용하는 사람들을 위해 일하지 않은 당신의 경험에 의해 색을 입힌 관점을 언급하고 있다고 생각합니다. 이것은 흔한 일이지만 사람들이 일반적으로 올바르게 사용하는 것은 저의 경험이었습니다.

이점은 유형이 유선 또는 디스크로 전송되는지 여부에 따라 메모리 공간 및 CPU 시간이며 IO 공간 일 수도 있습니다. 부호없는 유형은 컴파일러 검사를 통해 불가능한 특정 작업을 수행하지 않고 사용 가능한 범위를 확장하는 동시에 필요한 경우 성능을 높이기 위해 더 작은 크기를 유지합니다.

올바른 사용자가 예상하는대로 사용하는 것이다 - 당신이 알고 언제 확실히는 당신이 그들을 사용할 수 있습니다 영구적으로 (어떻게 확신없이 제한하거나하지 않습니다 나중에 후회).

  • 절대로 부정적이지 않은 것을 표현하려는 경우 public uint NumberOfPeople부호없는 유형을 사용하십시오.
  • 합리적으로 255 ( public byte DamagedToothCount) 보다 클 수없는 것을 표현하려는 경우 바이트를 사용하십시오.
  • 합리적으로 255보다 클 수 있지만 수천의 숫자는 절대로 표현하지 않으 려면 짧은 ( public short JimmyHoffasBankBalance)을 사용하십시오.
  • 수십만, 수백만이 될 수 있지만 수십억에 도달 할 가능성이없는 것을 표현하려는 경우 int ( public int HoursSinceUnixEpoch)를 사용하십시오.
  • 이 숫자가 무한히 큰 값을 가질 수 있거나 수십억을 가질 수 있다고 생각하지만 수십억을 확신 할 수 없다면 최선의 방법은 무엇입니까? 충분히 길지 않으면 흥미로운 문제가 발생하여 임의의 정밀도 숫자 ( public long MyReallyGreatAppsUserCountThisIsNotWishfulThinkingAtAll)를 살펴 봐야합니다 .

이 추론은 부호있는, 부호없는, 다양한 크기의 유형 등을 선택할 때 전체적으로 사용될 수 있으며 실제로 표현하는 데이터의 논리적 진실에 대해서만 생각하면됩니다.


11
전화 번호 "숫자"는 숫자가 아니라 숫자의 문자열이며 선택적으로 서식을 지정해야합니다. 당신은 이것을 알고있는 것처럼 보이지만 우리는 나쁜 모범을 세우고 싶지 않습니다. 또한, 어떤 가치의 범위를 임의로 제한하는 것은 근시안적인 반 패턴입니다 – int문제 도메인이 실제로 가치를 제한한다는 사실을 알지 않는 한 , 어느 은행도 계좌를 33K quid로 제한하고 싶지 않습니다 (재미를 생각하지 마십시오) 때 오버플로 ...!).
amon

3
새로운 인생 목표 : 은행 계좌의 필수 유형을 초과하는 상당한 초안 초안.
recursion.ninja

11
부호없는 유형과 부호없는 유형 사이에 산술이 혼합 된 경우와 같이 특정 장소에서 부호없는 유형을 사용하지 않는 데는 충분한 이유가 있습니다. 서명되지 않은 정수와 관련된 모범 사례는 무엇입니까?를 참조하십시오 . .

19
나는 여기의 추론에 동의하지 않습니다. 부호없는 유형은 int에 익숙한 경우 빼기와 비교가 예기치 않기 때문에 종종 실수입니다 (일관된 방식으로 작동하지만 "항상 긍정적"이 아닙니다). 당신이 그들을 사용해야 할 특별한 이유가 없다면 나는 그들을 피할 것입니다. 또한 바이트 대 short 대 int의 크기가 중요한 이유는 무엇입니까? 구조체는 해당 멤버 또는 배열을 특정 정렬로 채 웁니다. 크기가 정말로 중요한 경우 (특히 C # 코드와 달리) 또는 특별히 255에서 랩 어라운드를 원하는 경우에만 바이트를 사용합니다.
Adam D. Ruppe

4
"이점은 메모리 공간과 CPU 시간"입니다 ... 작은 유형이 실제로 CPU 시간을 절약 할 수 있는 사례 는 없습니다 . 정수 연산은 머신 사이즈 타입 보다 빠르지 않습니다 . 즉 CPU에 관한 한, 잘 사용할 수 있습니다 long. 메모리 절약은 물론 캐시 라인 효율성 등을 개선하여 간접적으로 시간을 절약 할 수 있지만, 소형 유형의 정렬 문제는 간접적으로 시간을 소비 할 수 있습니다.
leftaroundabout

16

그것을 사용하는 것이 좋습니다 어디 물론, 경우가있다 uint거나 short또는 Int16. 데이터 범위가 해당 변수 유형의 제약 조건에 맞는다는 것을 알고 있으면 해당 유형을 사용해도됩니다.

메모리가 제한된 환경이나 대량의 객체를 처리 할 때는 가장 작은 크기 변수를 사용하는 것이 좋습니다. 예를 들어, ints 대 shorts 의 백만 요소 배열의 경우 크기에 큰 차이가 있습니다 .

종종 다음 중 하나 이상의 이유로 인해 실제 코드에서 발생하지 않습니다.

  • 데이터 제약은 미리 알려지지 않았다
  • 데이터 제약 조건이 확실하지 않거나 변경 될 가능성이있는 것으로 확인되었습니다
  • 더 넓은 데이터 범위에서 함수를 재사용 할 수있는 희망이있었습니다.
  • 개발자는 제약 조건을 생각하는 데 시간이 걸리지 않았습니다.
  • 더 작은 변수 유형을 사용하여 메모리 절약은 중요하지 않았습니다.

더 많은 이유가있을 수 있지만, 그 결과는 다음과 같습니다. 다른 변수 유형을 결정하고 사용하는 데 걸리는 시간은 그렇게하는 데 충분한 이점을 제공하지 못했습니다.


8

C에서 정수 승격을 포함하지 않는 컨텍스트 에서 부호없는 값은 "래핑"추상 대수 고리의 멤버로 작동하도록 지정되었습니다. 따라서 XY는 X에 추가 될 때 X를 생성하는 고유 한 값을 생성합니다. ), 부호있는 정수 유형은 계산이 특정 범위 내에있을 때 정수처럼 동작하는 것으로 지정되었으며 계산이 그 범위를 넘어 서면 아무것도 할 수 없었습니다. 그러나 C #의 숫자 의미론은 완전히 다릅니다. 확인 된 숫자 컨텍스트 내에서 부호있는 유형과 부호없는 유형 모두 계산이 범위 내에 머무르면 정수처럼 동작 OverflowException하고 그렇지 않은 경우에는 던져집니다 . 확인되지 않은 상황에서 둘 다 대수 고리처럼 동작합니다.

Int32컴팩트 스토리지 또는 운송을 위해 물건을 포장하거나 포장을 풀어야 할 때보 다 작은 데이터 유형을 사용하는 것이 일반적으로 가치있는 유일한 시간 입니다. 50 억 개의 양수를 저장해야하고 모두 0에서 100 사이의 범위에 있으면 4 개가 아닌 1 바이트를 사용하면 1.5GB의 저장 공간이 절약됩니다. 크게 절약됩니다. 그러나 코드 조각에 총 수백 개의 값을 저장해야하는 경우 각 값을 4 개가 아닌 1 바이트로 만들면 약 600 바이트가 절약됩니다. 아마도 귀찮게 할 가치가 없습니다.

부호없는 유형과 관련하여 정보 교환을 수행하거나 숫자를 조각으로 나눌 때 실제로 유용한 유일한 시간입니다. 예를 들어 96 비트 정수에서 수학을 수행해야하는 경우 부호없는 정수 그룹보다 부호없는 32 비트 정수 3 개의 그룹에서 계산을 수행하는 것이 훨씬 쉽습니다. 그렇지 않으면 부호있는 32 비트 또는 64 비트 값의 범위가 적절하지 않은 상황은 많지 않지만 같은 크기의 부호없는 값으로 충분합니다.


4

일반적으로 서명되지 않은 형식은 불쾌한 방식으로 오버플로되기 때문에 사용하지 않는 것이 좋습니다. x = 5-6코드에서 갑자기 시한 폭탄입니다. 한편 부호없는 유형의 이점은 단일 정밀도의 단일 비트로 귀결되며, 그 비트가 가치가 있다면 더 큰 유형을 사용해야합니다.

더 작은 유형이 의미가있는 유스 케이스가 있지만 메모리 사용에 대해 염려하거나 전송 또는 캐시 효율성을 위해 데이터를 팩킹해야하는 경우 또는 다른 여러 가지 우려가없는 경우 일반적으로 더 작은 유형을 사용하면 이점이없는 경우가 있습니다. . 또한 많은 아키텍처에서 실제로 이러한 유형을 사용하는 것이 느리 므로 실제로 적은 비용을 부과 할 수 있습니다.


3
C에서 부호있는 오버플로는 부호없는 오버플로보다 훨씬 나쁩니다 (정의되지 않은 동작이기 때문에 부호없는 것이 주행 거리계처럼 롤오버되도록 지정 되었기 때문). OTOH, 서명 / 언더 플로는 서명되지 않은 언더 플로보다 실제로 덜 일반적입니다.
Kevin

사실이지만 서명 된 오버플로는 일반적으로보다 명확하고 예측 가능합니다.
Jack Aidley

나는 일반적으로 동의하지만 당신은 현대 컴파일러 최적화 수, 예를 들어,주의해야 할 i+1>i1경우 i다른 불쾌한 행동의 전체 호스트와 함께 서명됩니다. 부호없는 오버플로는 코너 케이스에 버그를 일으킬 수 있습니다. 서명 된 오버플로는 전체 프로그램을 의미가 없게 만들 수 있습니다 .
Kevin

@ JackAidley 5-6은 부호가 있든 없든 상관없이 동일한 비트 패턴을 생성하므로 말이 이해되지 않는 것이 확실합니다.
Ingo

@ Ingo : 비트 패턴을 얼마나 자주 보십니까? 중요한 것은 비트 패턴 의 의미 는 비트가 켜져 있거나 꺼져있는 것이 아닙니다.
Jack Aidley

2

특히 .NET 유형을 처리 할 때 질문에 대해 잊어 버리거나 접할 수있는 것은 CLS Compliance 입니다. .NET Framework에 구축 된 모든 언어에서 모든 유형을 사용할 수있는 것은 아닙니다.

C # 이외의 언어로 소비되는 코드를 작성하고 해당 코드가 가능한 한 많은 .NET 언어와 상호 운용되도록하려면 유형 사용을 CLS 규격 인 언어로 제한해야합니다.

예를 들어 초기 버전의 VB.NET (7.0 및 7.1)은 부호없는 정수 ( UInteger)를 지원하지 않았습니다 .

http://msdn.microsoft.com/en-us/library/aa903459(v=vs.71).aspx

부호없는 정수는 CLS 규격이 아니므로 클래스 라이브러리 소비자가 누구인지 확실하지 않은 경우주의해서 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.