2016-06-28 4 views
1

MAX (2, x)로 정의 된 정수 중 하나가 발견되기 전에 잠시 디버깅했습니다. 2가 분명히 -4보다 클 경우에도 -4를 반환합니다.중첩 된 MAX는 때때로 다양한 객체 유형을 사용할 때 가장 작은 값을 반환합니다. MAX (a, MAX (b, c))

불규칙성을 처음으로 경험할 수 있도록 내 코드가 실행되는 단순화 된 버전입니다.

NSLog(@"a) %i", (int)MAX(2,-4)); 
    NSString *aString = @"90586381095716439405631195482586763570805293418319186736659080000000000000"; 
    int aNumber = (int)MAX(2,10-MAX(1,(aString.length/5))); 
    NSLog(@"b) %i", aNumber); 
    NSLog(@"c) %i", (int)MAX(2,10-MAX(1,16))); 

a)는 예상대로 2를 기록 할 것이다.

b) 로그에 -4가 나와 나에게 의미가 없습니다.

C)가 예상대로 2를 기록합니다 (현재 B 내가지고 있지 않다 무엇을 나에게 더 적은 의미)


한다? MAX는 xCode에서 갈색이므로 UIKit 또는 수학 라이브러리의 CLAN으로 설정되었다고 생각하게합니다. 아마도 MAX가 처리 된 후에 내부 MAX가 처리되기 때문에 MAX가 중첩되면 이상한 버그가 발생합니다. 그러나 만약 그렇다면 c)도 기록하지 않았을 것입니까 -4?

답변

2

Objective-C는 사용하지 않지만 문자열의 length은 아마도 부호없는 값입니다. 그것이 평범한 C와 같은 방식으로 작동한다면, 내부 MAX의 결과도 부호가 없어지게 될 것이고 따라서 10으로부터의 뺄셈은 부호없는 것으로 수행 될 것입니다. 이렇게하면 값이 언더 플로우되고 매우 큰 값이됩니다. 4294967292는 32 비트 정수로 가정하고 따라서 외부 값 MAX에 의해 선택됩니다.

마지막으로 int은 다음을 서명으로 다시 변환하고 음수 값으로 끝납니다. 컴파일러가 유용하고 (int)을 그대로두면 경고가 표시됩니다.

이야기의 도덕, 외부의 캐스트를 사용하지 마십시오. 컴파일러가 귀중한 경고를주지 않게합니다.

+0

와우 네가 맞아, string.length에'(int) '를 주조하면 문제가 해결된다. '(int) aString.length' 그리고 또한 c)'(NSUInteger)'를 호출합니다. 이것은'.length가 무엇인지,'16'이 문제를 재현했습니다. 그래서 MAX는'NSUInteger'를 처리하는 데 문제가 있습니다. 흥미 롭습니다. –

+0

@AlbertRenshaw : 정말 MAX와 아무 관련이 없습니다. 문제는 빼기입니다. 부호없는 값을 빼고 언더 플로우를 원하지 않으면 빼기 전에 값을 확인해야합니다. –

+0

반드시 MAX를 적용하기 전에 값을 확인하면 문제가 해결됩니다. MAX (b, c)를 정수 "d"로 정의한 다음 MAX (a, d)를 수행하면 a가 반환됩니다. NSUinteger가 관련되어있을 때 MAX를 처리하는 논리에 문제가있는 것 같습니다. 손에 넣기 전에 NSUinteger를 처리하고 max에 두거나 (또는 ​​이전에 값을 확인한 다음 최대 값으로 두는 것)이 문제를 방지합니다. Hmm –