서명되지 않은 int에 대해 음의 이중으로 주조하는 동작이 C 표준에 정의되어 있습니까?ARM 대 x86의 다른 동작
다른 결과를 얻는 것처럼 보이는 다른 플랫폼에서 실행되는 코드가 있습니다.저는 적절한 설명을 찾고 있습니다.
캐스팅을 기대했습니다.unsigned
같은 일을 하다float
아니면double
에 관해서는int
1.
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
다음과 같은 서명된 형식으로 값을 지정합니다.int
is 구현이 정의되었습니다(정의되지 않음).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
'programing' 카테고리의 다른 글
phphmyadmin에서 트리거를 만드는 중 오류 발생 (0) | 2023.10.04 |
---|---|
CSS에 높이가 설정되지 않은 div의 높이를 가져옵니다. (0) | 2023.10.04 |
디렉토리 외부에서 WordPress 사용자 세부 정보 사용 (0) | 2023.10.04 |
페이지 로딩 후 jquery code 하는 방법? (0) | 2023.09.24 |
MySQL에서 현재 타임스탬프 내에 10분 이내인 모든 레코드를 선택하는 방법은 무엇입니까? (0) | 2023.09.24 |