programing

서명되지 않은 int에 대해 음의 이중으로 주조하는 동작이 C 표준에 정의되어 있습니까?ARM 대 x86의 다른 동작

bestprogram 2023. 10. 4. 22:12

서명되지 않은 int에 대해 음의 이중으로 주조하는 동작이 C 표준에 정의되어 있습니까?ARM 대 x86의 다른 동작

다른 결과를 얻는 것처럼 보이는 다른 플랫폼에서 실행되는 코드가 있습니다.저는 적절한 설명을 찾고 있습니다.

캐스팅을 기대했습니다.unsigned같은 일을 하다float아니면double에 관해서는int1.

Windows:

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == -123

WinCE(암):

double dbl = -123.45; 
int d_cast = (unsigned int)dbl; 
// d_cast == 0

편집:

올바른 방향을 제시해 주셔서 감사합니다.

해결책을 보다

double dbl = -123.45; 
int d_cast = (unsigned)(int)dbl; 
// d_cast == -123
// works on both. 

각주 1: 편집자 참고: 범위를 벗어난 것으로 변환unsigned다음과 같은 서명된 형식으로 값을 지정합니다.intis 구현이 정의되었습니다(정의되지 않음).C17 § 6.3.1.3 - 3.

그래서 과제는.d_cast또한 다음과 같은 경우에 대한 표준에 의해 확정되지 않았습니다.(unsigned)dbl결국 특정 구현에 큰 긍정적인 가치가 됩니다.(그 실행 경로는 UB를 포함하므로 이론적으로 ISO C는 이미 창 밖에 있습니다.)실제로 컴파일러는 일반 2의 보완 기계에서 기대하는 것을 수행하고 비트 패턴을 변경하지 않습니다.

아니요.


이 변환은 정의되지 않았으므로 휴대할 수 없습니다.

C99/C116.3.1.4

실제 플로팅 유형의 유한 값을 _Boole 이외의 정수 유형으로 변환하면 부분 부분이 삭제됩니다(즉, 값이 0으로 잘림).정수형으로 적분 부분의 값을 나타낼 수 없으면 동작이 정의되지 않습니다.

C116.3.1.4 각주 61:

정수 유형의 값을 부호 없는 유형으로 변환할 때 수행되는 잔여 작업은 실제 부동 유형의 값을 부호 없는 유형으로 변환할 때 수행할 필요가 없습니다.따라서 휴대용 실제 부동값의 범위는 (-1, Utype_)입니다.MAX+1).

C 및 C++는 (부호 int) negative Float를 (부호 int) negative Float와 동등한(부호 int) negative Float로 명확하게 정의해야 합니다.특히 x86과 ARM이 분리된 지금은 정의되지 않은 상태로 방치하는 것은 재앙입니다.ARM은 x86을 따라야 하며 언어 사양에서 이 커다란 실망감을 해결해야 합니다.

엄밀하게 -1과 UINT_MAX+1.0 사이의 값을 변환하는 가장 효율적인 방법이 음의 값으로 의미 있게 행동할 수 없고 고객이 음의 값으로 행동하는 것에 신경 쓰지 않는 플랫폼이 있다면,표준의 저자들은 구현이 변환을 수행하는 데 덜 효율적인 수단을 사용하도록 의무화하고 싶지 않았을 것입니다.또한, 0과 -1 사이의 값을 포함한 음의 분수 값의 변환을 처리하는 방법에서 구현이 일관되지 않았을 수도 있습니다.예를 들어, 구현이 처리할 수 있다는 것은 거의 불가능합니다.someUnsigned = someFloat;~하듯이someUnsigned = (someFloat < 0) ? (UINT_MAX+1.0)+someFloat : someFloat;를 UB로 를 UB 로의 .(unsigned)(-1.0f)다를 는 안 UINT_MAX, 오히려 다양한 종류의 구현이 예측 가능하게 처리될 것으로 예상되거나 예상되지 않아야 할 경우에 대한 판단을 포기하는 것입니다.

언급URL : https://stackoverflow.com/questions/10541200/is-the-behaviour-of-casting-a-negative-double-to-unsigned-int-defined-in-the-c-s