code

NSUInter 대 NSInter, Int 대 Unsigned 및 유사한 경우

starcafe 2023. 9. 15. 21:14
반응형

NSUInter 대 NSInter, Int 대 Unsigned 및 유사한 경우

NSUInter를 사용할 때와 NSInter를 사용할 때를 설명할 수 있는 전문 지식을 가진 사람이 있습니까?

반환된 값이 항상 서명되지 않는 경우에도 저는 Cocoa methods가 NSInteger를 반환하는 것을 보았습니다.

근본적인 이유는 무엇입니까?NSInteger 또는 Integrity는 음의 값을 표현하고자 하는 경우로 엄격히 제한됩니까?

NSObjCR 런타임에서.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

NSUInter vs.를 다룰 때는 정수 변환 규칙에 대해서도 주의해야 합니다.NSInter:

예를 들어 다음 조각은 1(true)을 인쇄할 것으로 예상하더라도 0(false)을 반환합니다.

NSInteger si = -1;
NSUInteger ui = 1;
printf("%d\n", si < ui);

그 이유는 [si] 변수가 암시적으로 부호 없는 int로 변환되고 있기 때문입니다!

이러한 '이슈'와 이를 해결하는 방법에 대한 자세한 논의는 CERT의 Secure Coding 사이트를 참조하십시오.

기본적으로 정수는 부호가 있는 것으로 가정됩니다.즉, 컴파일러는 음수 또는 양수를 저장하기 위해 정수 변수가 호출된다고 가정합니다.이는 범위가 어느 방향이든 도달할 수 있는 범위를 제한합니다.예를 들어 32비트 int의 범위는 4,294,967,295입니다.실제로는 값이 양수 또는 음수일 수 있으므로 실제로 범위는 -2,147,483,648 ~ +2,147,483,647입니다.만약 변수가 음의 값을 저장하기 위해 호출되지 않을 것이라는 것을 알고 있다면, 부호가 없는 것으로 선언할 수 있으며, 따라서 (양의) 범위를 0에서 +4,294,967,295까지 확장할 수 있습니다.그래서 출력 범위가 제한되어 있는 것을 알 때 NSInter를 사용해도 괜찮다고 생각합니다.저는 개인적으로 NSUInter를 사용합니다. 만약 정말 큰 양수만 반환해야 한다면 말이죠.

만약 당신의 방법이 출력 범위가 적절하게 제한되어 있다면, 당신은 다음을 사용할 수 있습니다.NSInteger타이핑하기 편하니까요.당신 말대로 음수를 반환해야 한다면,NSInteger이 마을에서 유일한 게임입니다. 저는 오직NSUInteger어떤 이유에서인지 정말 많은 숫자를 돌려줘야 한다면 말입니다.

코코아에 대해서는 자세히 모르지만, 보통 부호가 있는 정수의 유일한 단점은 보통 부호가 없는 int로 최대치의 절반을 갖는다는 것입니다.32비트 시스템의 경우 40억이 아닌 약 20억이 필요합니다.일반적으로 이는 큰 차이가 아닙니다. 만약 여러분이 20억에 가까운 값을 다루고 있다면, 여러분은 아마도 같은 경우에 40억 개의 최대치에 대해 걱정할 것입니다. 왜냐하면 여전히 2나 3의 곱으로 오버플로에 근접해 있기 때문입니다.

부호가 있는 정수는 일반적으로 추가적인 유연성과 부호가 없는 정수를 거의 모든 시나리오에 사용할 수 있다는 사실과 함께 음이 필요한 경우 추가적인 시나리오를 모두 사용할 수 없기 때문에 선호됩니다.

양의 값만 적용하려는 경우 서명되지 않은 것이 선호될 수 있습니다.

언급URL : https://stackoverflow.com/questions/2557209/nsuinteger-vs-nsinteger-int-vs-unsigned-and-similar-cases

반응형