Objective-C 암묵적 변환으로 정수 정밀도 'NSUIInterger'(일명 '서명되지 않은 긴')에서 'int' 경고로 손실됨
몇 가지 연습을 하고 있는데 다음과 같은 경고를 받았습니다.
암묵적 변환으로 정수 정밀도가 손실됨: 'NSUIInterger'('서명되지 않은 긴'이라고도 함)에서 'int'로 변경됨
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSArray *myColors;
int i;
int count;
myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
count = myColors.count; // <<< issue warning here
for (i = 0; i < count; i++)
NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}
return 0;
}
그count
의 방법NSArray
반환하다NSUInteger
및 64비트 OS X 플랫폼에서
NSUInteger
로 정의됩니다.unsigned long
,그리고.unsigned long
는 64비트 부호 없는 정수입니다.int
는 32비트 정수입니다.
그렇게int
다음 데이터 유형보다 "확장"된 데이터 유형입니다.NSUInteger
따라서 컴파일러 경고입니다.
「Foundation Data Types Reference」의 NSInterger도 참조해 주세요.
32비트 응용 프로그램을 빌드할 때 NSUIInterger는 32비트 부호 없는 정수입니다.64비트 애플리케이션은 NSUIInterger를 64비트 부호 없는 정수로 취급합니다.
컴파일러 경고를 수정하려면 로컬을 선언합니다.count
로서 변이하다.
NSUInteger count;
또는 (어레이에 포함시킬 수 있는 용량이 다음 값을 넘지 않는 경우)2^31-1
요소!) 명시적 캐스트를 추가합니다.
int count = (int)[myColors count];
Martin의 답변과는 달리 int에 캐스팅(또는 경고를 무시)하는 것은 어레이의 요소가 2^31-1을 넘지 않는 경우에도 항상 안전한 것은 아닙니다.64비트용 컴파일에서는 사용할 수 없습니다.
예를 들어 다음과 같습니다.
NSArray *array = @[@"a", @"b", @"c"];
int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!
if (i == NSNotFound) {
// thought we'd get here, but we don't
NSLog(@"it's not here");
}
else {
// this is what actually happens
NSLog(@"it's here: %d", i);
// **** crash horribly ****
NSLog(@"the object is %@", array[i]);
}
[ Project ]> [ Build Setting ]에서 키를 변경합니다.「 type check calls to printf / scanf : NO 」
설명: [원리]
printf 및 scanf 등에 대한 호출을 체크하여 지정된 형식 문자열에 적합한 유형을 지정하고 형식 문자열로 지정된 변환이 적절한지 확인합니다.
잘 되길 바래
기타 경고
목적 c 암묵적 변환은 정수 정밀도 'NSUIInterger'(일명 '서명되지 않은 긴')를 'int'로 손실합니다.
키 "암시적 변환"을 32비트 유형> [디버깅]> [ *64 아키텍처 : 아니요]로 변경합니다.
[예외: 64비트 아키텍처 변환에 대한 다른 경고가 무효가 될 수 있습니다.
저의 경우 "int"에 명시적인 캐스팅을 하면 문제가 해결됩니다.저도 같은 문제가 있었어요.그래서:
int count = (int)[myColors count];
언급URL : https://stackoverflow.com/questions/16918826/objective-c-implicit-conversion-loses-integer-precision-nsuinteger-aka-unsig
'your programing' 카테고리의 다른 글
Bash의 단순 논리 연산자 (0) | 2023.04.22 |
---|---|
Windows에서 PATH 환경변수가 과도하게 입력되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
Azure : BizSpark 가입 시 앱 서비스 및 앱 서비스 플랜 위치 변경 방법 (0) | 2023.04.22 |
ASP.NET MVC 퍼포먼스 (0) | 2023.04.22 |
스택 익스체인지Azure Redis를 사용한 Redis가 비정상적으로 느리거나 타임아웃 오류를 발생시킨다. (0) | 2023.04.22 |