Consider this code:
#include <stdio.h>
int main(void)
{
/* TEST 1 */
double d = 128;
char ch = (char)d;
printf("%d
", ch);
/* TEST 2 */
printf("%d
", (char)128.0);
/* TEST 3 */
char ch1 = (char)128.0;
printf("%d
", ch1);
return 0;
}
Results:
gcc* clang* cl*
TEST 1 -128 -128 -128
TEST 2 127 0 -128
TEST 3 127 -2 -128
* latest version
Questions:
- Why the results differ between tests (excluding
cl
)?
- Why the results differ between compilers (excluding
TEST 1
)?
- In case of UB/IB, where is the UB/IB exactly? What the standard says?
- [Extra question] Why
clang
shows so different behavior? Where these 0
and -2
come from?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…