2017-11-20 3 views
0

나는 4004 자리 숫자가 인쇄 된 다음 프로그램 실행하면 :특정 short-double 변환이 4004 자리 숫자와 같은 이유는 무엇입니까?

double d; 
short s; 
d = 23234564568788.5; 
d = s = d; 
printf("%lf\n", d); 

왜?

+2

변환 중 부호가있는 정수가 UB 인 경우 오버 플로우됩니다. 그것은 누가 알겠습니까? https://ideone.com/K4diK7 – Sneftel

+0

내가 속인 속임수에 대한 유형은 다르지만 그 대답은 동일합니다. – user694733

+0

이것은 오버플로가 아닙니다. 이는 단지 표현할 수없는 값의 경우 일뿐입니다. 그러나 그 행동은 아직 정의되지 않았습니다. 따라서 여러분은'23234564568788.5' 또는 부동 소수점 예외 또는 'Hello world'를 얻을 수 있습니다. –

답변

1

이것은 UB입니다. 예를 들어, 내 컴퓨터에서 결과는 -32768.0입니다.

내 gcc는 경고 : warning: conversion to 'short int' from 'double' may alter its value [-Wfloat-conversion]을 출력하므로 C를 작성해야하는 방식이 아니므로 (코드가 올바르게 실행될 것으로 예상되는 경우)이 작업을 수행해서는 안됩니다.

관련 문제