本文介绍了类型转换:双精度字符:多个问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑以下代码:
#include <stdio.h>
int main(void)
{
/* TEST 1 */
double d = 128;
char ch = (char)d;
printf("%d\n", ch);
/* TEST 2 */
printf("%d\n", (char)128.0);
/* TEST 3 */
char ch1 = (char)128.0;
printf("%d\n", ch1);
return 0;
}
结果:
gcc* clang* cl*
TEST 1 -128 -128 -128
TEST 2 127 0 -128
TEST 3 127 -2 -128
* latest version
问题:
- 为什么测试之间的结果有所不同(不包括
cl
)? - 为什么编译器之间的结果不同(
TEST 1
除外)? - 对于UB/IB,UB/IB到底在哪里?标准怎么说?
- [额外问题]为什么
clang
表现出如此不同的行为?这些0
和-2
来自何处?
- 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 these0
and-2
come from?
推荐答案
当 CHAR_MAX == 127
时,(char)128.0
是未定义的行为(UB).
这不是UB,原因是整数溢出.由于转换规则,它是UB.
This is not UB due to integer overflow. It is UB due to conversion rules.
这篇关于类型转换:双精度字符:多个问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!