source

C/C++ int 또는 unsigned int 사용

manycodes 2023. 7. 25. 21:09
반응형

C/C++ int 또는 unsigned int 사용

많은 코드 예제에서 소스 코드, 라이브러리 등.때 하는 것을 , 내를볼수있, 나는가 int는것을봅.unsigned int훨씬 더 말이 될 것 같습니다.

한 은 제가자보는한곳에 있습니다.for루프. 아래 예를 참조하십시오.

for(int i = 0; i < length; i++)
{
    // Do Stuff
}

도대체 왜 당신은 그것을 사용합니까?int금도보다 .unsigned int그것은 요? - 은 타이핑하는 것에 쓸가 없나요? 사람들은 타이핑하는 것에 신경 쓸 수 없습니다.unsigned?

용사를 합니다.unsigned발견하기 어려운 프로그래밍 오류를 발생시킬 수 있으며, 보통 서명된 것을 사용하는 것이 더 좋습니다.int단지 그들을 피하기 위해서. 가지 이 앞으로가 하고 이렇게 쓸 : 가 지 예 는 앞 으 기 경 같 우 입 니 다 는 하 록 이 한 다 과 음 결 고 로 기 하 정 반 하 복 뒤 로 아 로 가 라 니

for (unsigned i = 5; i >= 0; i--) {
    printf("%d\n", i);
}

또 다른 예는 루프 내부에서 수학을 수행하는 경우입니다.

for (unsigned i = 0; i < 10; i++) {
    for (unsigned j = 0; j < 10; j++) {
        if (i - j >= 4) printf("%d %d\n", i, j);
    }
}

용사를 합니다.unsigned이런 종류의 버그의 가능성을 소개하지만, 실제로는 아무런 이점이 없습니다.

그것은 일반적으로 게으름이나 이해력 부족입니다.

값이 음수가 아닐 때는 항상 부호 없는 int를 사용합니다.이는 올바른 값을 지정하는 문서화 목적에도 도움이 됩니다.

IMHO, "unsigned int"보다 "int"를 사용하는 것이 더 안전하다는 주장은 단순히 잘못되었고 나쁜 프로그래밍 관행입니다.

Ada 또는 Pascal을 사용한 적이 있다면 값에 대한 특정 범위(예: 1, 2, 3, 4, 5만 될 수 있는 정수)를 지정하는 훨씬 안전한 방법을 사용하는 데 익숙할 것입니다.

한다면length 한또입니다.int그런 다음 동일한 정수 유형을 사용해야 합니다. 그렇지 않으면 비교 문에서 서명된 유형과 서명되지 않은 유형을 혼합할 때 이상한 현상이 발생합니다.대부분의 컴파일러는 경고를 제공합니다.

당신은 계속 물어볼 수 있습니다, 왜 그래야 하는지.length서명하시겠습니까?역사적인 이야기일 겁니다.

또한, 만약 당신이 루프를 되돌리기로 결정한다면, 즉

for(int i=length-1;i>=0 ;i--)
{
   // do stuff
}

부호 없는 int를 사용하면 논리가 깨집니다.

저는 프로그래밍을 할 때 가능한 한 명확하게 하기로 결정했습니다.양의 하려면 즉, 만약내항가상양가을값려를한사용다면하고변수진의▁whose,▁that즉한▁a만▁variable면려,고,unsigned. 서 많은 이 "곤충을 고 언급하지만를 들어 하는 사람은 거의 .여기서 많은 사람들이 "곤충을 발견하기 어렵다"고 언급하지만, 예를 들어 설명하는 사람은 거의 없습니다.다음 옹호자의 사용 예를 고려합니다.unsigned여기 있는 대부분의 게시물과 달리:

enum num_things {
    THINGA = 0,
    THINGB,
    THINGC,
    NUM_THINGS
};

int unsafe_function(int thing_ID){
    if(thing_ID >= NUM_THINGS)
        return -1;

    ...
}

int safe_function(unsigned int thing_ID){
    if(thing_ID >= NUM_THINGS)
        return -1;

    ...
}

int other_safe_function(int thing_ID){
    if((thing_ID >=0 ) && (thing_ID >= NUM_THINGS))
        return -1;

    ...
}

/* Error not caught */
unsafe_function(-1);

/* Error is caught */
safe_function((unsigned int)-1);

에서, 의 값이 의위예에값다같음됩어니로 ?thing_ID첫 번째 경우 음수 값이 다음보다 크거나 같지 않음을 알게 됩니다. NUM_THINGS따라서 기능은 계속 실행됩니다.

두 번째 경우에는, 실제로 런타임에 이것을 잡을 수 있습니다. 왜냐하면 서명이 있기 때문입니다.thing_ID조건부에서 서명되지 않은 비교를 강제로 실행합니다.

물론, 당신은 다음과 같은 것을 할 수 있습니다.other_safe_function하지만 이것은 더 명확하고 서명되지 않은 정수를 사용하는 것보다 더 둔탁한 것처럼 보입니다.

내 생각에 가장 중요한 이유는 당신이 선택한다면.unsigned int논리적 오류가 발생할 수 있습니다.사실, 당신은 종종 다음의 범위가 필요하지 않습니다.unsigned int,사용.int더 안전합니다.

이 작은 코드는 사용 사례와 관련이 있습니다. 만약 당신이 어떤 벡터 요소를 부른다면 프로토타입은 int이지만 c++ eg에서 그것을 하는 많은 현대적인 방법들이 있습니다.(const auto & v : vec) {} 또는 반복자의 경우, 음수를 뺄셈하거나 음수에 도달할 수 없는 경우, 부호 없는 숫자를 사용할 수 있고 사용해야 합니다(예상되는 값의 범위가 훨씬 더 좋음). 여기에 게시된 많은 예에서 실제로 필요하다는 것을 보여주듯이, 때때로 사용 사례와 상황에 대한 모든 것입니다.어떤 엄격한 규칙도 모든 경우에 적용되는 것은 아니며 강제로...

언급URL : https://stackoverflow.com/questions/22587451/c-c-use-of-int-or-unsigned-int

반응형