2010-03-22 6 views
7

은 그것을 밖으로 시도 :iphone : 부호없는 정수로 변환 된 float가 음수이면 0으로 설정 되나요?

volatile float bob = -344.0f; 
unsigned int fred = (unsigned int)bob; 

printf("%d\n",fred); 

출력은 0

될 것입니다 분명 나는 그것이 내가 포장하고 행동 않는 (AN unsgined INT에 서명 INT에서 주조 한 것처럼 랩 어라운드 기대하고있다 아이폰에서 예상대로)

우리는 부동 소수점 설정과 관련이 있다고 가정합니다.

어떤 아이디어가 있습니까?

+2

'휘발성'? o_O – kennytm

+0

@KennyTM : 최적화를 막기위한 몇 가지 무작위 시도. – matt

+0

오래된 스레드,하지만 최근에이 문제에 대해 좀 더 자세히 설명했습니다. XCode 7.2.x에서는 음수 부동 소수점을 부호없는 단변에 캐스팅하면 테스트 한 모든 iOS 플랫폼에서 값이 랩 어라운드되었습니다. 그러나 Xcode 7.3.1을 사용하면 iPad 3에서 자르기 코드가 0으로 바뀌고 iPhone 6에서 랩 어라운드가 발생합니다. –

답변

11

이것은 예상됩니다. 부호없는 int에 음수 float을 캐스트하면 정의되지 않은 동작 (UB)이 발생합니다. 만약 값이 랩 어라운드 (UB, BTW이기도 함)를 원한다면 먼저 부호있는 int로 변환 한 다음 unsigned int로 변환해야합니다. 이상적으로 UB에 전혀 의지하지 말고해야 할 일을 수행하는 더 좋은 방법을 찾아야합니다.

+0

그렇다면 VC++ 또는 PSP 컴파일러에 문제가없는 이유는 무엇입니까? – matt

+4

@matt : 정의되지 않은 동작에 의존하기 때문에 –

+2

@matt : int가 0이 될 것으로 예상하는 경우 * 해당 컴파일러에서 문제가됩니다.그것이 정의되지 않은 동작의 문제입니다. 특정 일이 발생한다고 합리적으로 기대할 수는 없습니다. 랩 어라운드, 0으로 갈 수 있음, 고용주에게 암시적인 이메일을 보낼 수 있음 - 그것이 할 일을 완전히 정의하지 않았습니다. – Chuck

0

부호있는 int를 통해 전송. C 표준의

4

§6.3.1.4 :

실제 부동 유형의 유한 값 _Bool 이외 정수형 으로 변환되면, 소수부 은 폐기된다 (즉, 값 이 제로 방향으로 절단 됨). 정수 부분의 값 이 정수 유형으로 표시되는 일 수 없으면 동작은 정의되지 않습니다.

폴 R과 마찬가지로 이것은 정의되지 않은 동작입니다.

0

이 변환은 정의되어 있지 않으므로 이식 할 수 없습니다. C99 §6.3.1.4 각주 (50)에 따르면

:

remaindering 동작 실제 플로팅 타입의 값이 부호로 변환 할 때 정수형의 값은 수행 될 필요 부호 형식으로 변환 될 때 수행

유형. 따라서 이식 가능한 실수 부동 값의 범위는 (-1, Utype_MAX + 1)입니다.

이 변환이 이식 가능하지 않다는 점을 감안할 때, 임의의 특정 변환보다는 0을 반환하는 것이 합리적인 해석입니다. 적어도 2 가지 이유가 있습니다 : (1) 코드를 전달하기보다는 이식성이없는 코드에 플래그를 지정하는 것, (2) 부호를 삭제하는 것은 정수 유형의 동일한 값이 변환 될 때 일어나는 것과 크게 다릅니다. 특정 대안이 더 좋은 아이디어인지는 분명하지 않습니다.

관련 문제