문제

부호 있는 변수 대신 부호 없는 변수를 사용하는 것이 언제 적절한가요?에서는 어떻습니까? for 고리?

이에 대해 많은 의견을 듣고 있는데, 공감대와 비슷한 것이 있는지 알아보고 싶었습니다.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

저는 Java에 부호 없는 값이 없다는 것을 알고 있으며 이는 Java에 대한 신중한 결정이었을 것입니다. 썬 마이크로시스템즈' 부분.

도움이 되었습니까?

해결책

찾아서 기뻤어요 좋은 대화 이 주제에 관해서는 이전에 별로 생각해 본 적이 없었기 때문입니다.

요약하자면, signed는 일반적으로 좋은 선택입니다. 모든 숫자가 양수라고 확신하는 경우에도 변수에 대한 산술 연산을 수행하려는 경우(일반적인 for 루프 사례처럼).

마스크와 같은 비트 단위 작업을 수행하려는 경우 unsigned가 더 의미가 있습니다.또는 부호 비트를 활용하여 추가 양수 범위를 얻고자 하는 경우가 있습니다.

개인적으로 나는 일관성을 유지하고 두 가지 유형을 혼합하는 것을 피하는 자신을 믿지 않기 때문에 서명된 것을 좋아합니다(기사에서 경고한 것처럼).

다른 팁

위의 예에서 'i'가 항상 양수이고 더 높은 범위가 유리할 경우 unsigned가 유용할 것입니다.다음과 같은 '선언' 문을 사용하는 경우와 같습니다.

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

특히 이러한 값이 절대 변경되지 않는 경우.

그러나 사람들이 돈에 대해 무책임하고 지속적으로 적자를 내는 회계 프로그램을 수행하고 있다면 가장 확실하게 '서명됨'을 사용하고 싶을 것입니다.

경험상 좋은 규칙은 서명을 사용하는 것이지만 C는 실제로 기본값을 사용하므로 이를 다룰 수 있다는 점에서 나는 saint의 의견에 동의합니다.

C 및 C++ 컴파일러는 부호 있는 유형과 부호 없는 유형을 비교할 때 경고를 생성합니다.예제 코드에서는 루프 변수를 서명하지 않고 컴파일러가 경고 없이 코드를 생성하도록 할 수 없습니다(경고가 켜져 있다고 가정).

당연하게도 경고를 끝까지 올려서 컴파일하고 계시죠?

그리고 한 단계 더 나아가기 위해 "경고를 오류로 처리"하여 컴파일하는 것을 고려해 보셨나요?

부호 있는 숫자를 사용할 때의 단점은 예를 들어 0->n 값이 메뉴 선택이고 -1은 아무것도 선택되지 않았음을 의미하도록 오버로드하려는 유혹이 있다는 것입니다. 무언가가 선택되었는지 여부를 나타내고 다른 항목은 해당 선택 사항을 저장합니다.당신이 그것을 알기도 전에, 당신은 모든 곳에서 부정적인 것을 테스트하고 있고 컴파일러는 메뉴 선택을 당신이 가지고 있는 메뉴 선택 수와 어떻게 비교하고 싶은지에 대해 불평합니다. 그러나 그것은 서로 다른 유형이기 때문에 위험합니다. .그러니 그러지 마세요.

귀하의 비즈니스 사례에 따라 음수가 유효하지 않다고 명시되어 있다면 원하다 오류가 표시되거나 발생합니다.

이를 염두에 두고 저는 최근에 바이너리 파일의 데이터를 처리하고 데이터를 데이터베이스에 저장하는 프로젝트에서 작업하는 동안 부호 없는 정수에 대해 알게 되었습니다.나는 의도적으로 바이너리 데이터를 "손상"시켰고 결국 예상된 오류 대신 음수 값을 얻었습니다.값이 변환되었음에도 불구하고 그 값이 내 비즈니스 사례에 유효하지 않다는 것을 알았습니다.
내 프로그램에는 오류가 발생하지 않았으며 결국 데이터베이스에 잘못된 데이터가 들어갔습니다.사용했더라면 더 좋았을텐데 uint 프로그램이 실패했습니다.

size_t 종종 이에 대한 좋은 선택입니다. size_type STL 클래스를 사용하는 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top