2013-03-04 1 views
0

헤더를 살펴보면 NSUInteger와 UInt32 둘 다 32 비트 부호없는 정수로 정의되므로 64 비트 시스템에서 컴파일 할 때 Xcode에서 할당 할 때 경고의 정확도가 떨어지는 이유는 무엇인지 알 수 있습니다. 다른 하나?코코아 : NSUInteger 및 UInt32는 모두 32 비트 부호없는 정수로 정의됩니다. 왜 경고가 나오나요?

"암시 적 변환이 정수 정밀도를 잃는다 'NSUInteger를'(일명 '긴 부호') 'UINT32'에 (일명 '부호 INT')"

나는 경고 '긴으로 하나 언급되는 것을 볼 수 있습니다

'와 하나는'int '이지만, 둘 다이 시스템에서 동일한 32 비트 부호없는 정수로 해석되므로 정밀도가 손실되지 않아야합니다.

실제로 문제를 일으키지는 않지만 이해하기 쉽도록 뭔가 잘못 이해 한 것처럼 보입니다.

이 문제가 발생했습니다

하지만 '왜'에 반대 안전 주소 : Can I safely store UInt32 to NSUInteger?

+0

NSUInteger가 다른 시스템에서 64 비트 길이가 될 수 있기 때문일 수 있습니다. – Rakesh

답변

2

NSUIntegerNSInteger 심지어 아이폰 OS뿐만 아니라 OSX에서 사용할 수 있습니다.

#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 

아이폰 OS는 OSX 반면, 32 비트 장치가 64 비트 (이전 OSX 32 비트이었다 심지어는 32 비트 OS 용 애플리케이션을 위해 선택할 수있다), 따라서이 if-else directive가 설정되어있는 기초 포함하다이다.

OSX에서는 항상 %ldNSInteger을 사용하지만 iOS에서는 %d이어야합니다.

NSInteger%d을 사용하면 경고가 LESS 정수 정밀도로 표시됩니다. 64 비트의 OS X 플랫폼에서

+0

OSX에서 32 비트 용으로 컴파일하는 경우는 어떻습니까? – trojanfoe

+0

OK, 감사합니다. 따라서 컴파일러의 작동 방식에 관해서는 if-else 지시어가 해결되기 전에 경고 *를 계산한다는 의미이며, 따라서 불필요하다는 것을 아직 깨닫지 못하고 있습니까? –

+0

@trojanfoe :이 경우 if-else 지시문 –

4

:

  • NSUInteger

    unsigned long가 정의되고,
  • unsigned long는 64 비트의 부호없는 정수이다.

그래서 UInt32NSUInteger하지컴파일러 경고를 설명 동일한 크기를해야합니까.

는 "기초 데이터 유형 참조"도 NSUInteger 참조 :

32 비트 응용 프로그램을 구축, NSUInteger 32 비트 부호없는 정수입니다. 64 비트 응용 프로그램은 NSUInteger를 64 비트 부호없는 정수로 처리합니다.

비고 포인터 64 비트를 갖고 있다는 것을 의미 LP64 데이터 모델 (많은 유닉스와 같은 시스템과 같은) 64 비트 OS의 X의 용도. 64 비트 Windows는 이 길고은 32 비트이고 포인터는이 64 비트 인 IL32P64 데이터 모델을 사용합니다.

+0

고마워, 내가 MacTypes.h에서 헤더를 해석 할 때 멍청한 것 같아. UInt32 32 비트 부호없는 정수 ... typedef unsigned int UInt32; 그리고 NSObjCRuntime.h : #if __LP64__ || (TARGET_OS_EMBEDDED &&! TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typedef long NSInteger; typedef unsigned long NSUInteger; –

+1

@JoeyFourSheds : 예, 정확히 정의 된 곳입니다. '__LP64__'는 64 비트 플랫폼에서 true이고 NSUInteger는 unsigned long으로 정의되며 unsigned long은 64 비트 플랫폼에서 64 비트를가집니다! - Uint32에는 32 비트 만 있기 때문에 가능한 정밀도 손실이 있습니다. –

+0

감사합니다. (그리고 지저분한 코멘트에 대해 유감스럽게도, 코멘트에 새로운 라인을 만드는 것처럼 보이지 않으므로, '습관적으로'리턴 '을 칠 때마다 약 6 번 게시됩니다!). –

관련 문제