为什么将双重728.3转换为无符号字符会产生零? 728是0x2D8,所以不应该w
为0xD8
(216
)?
int w = (unsigned char)728.3;
int x = (int)728.3;
int y = (int)(unsigned char)728.3;
int z = (unsigned char)(int)728.3;
printf( "%i %i %i %i", w, x, y, z );
// prints 0 728 0 216
答案 0 :(得分:7)
来自C标准6.3.1.4p1:
当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零)。 如果整数部分的值不能用整数类型表示,则行为未定义。
因此,除非您有> = 10位unsigned char
,否则您的代码会调用undefined behaviour。
请注意,强制转换显式告诉编译器您知道自己在做什么,因此会抑制警告。
答案 1 :(得分:3)
假设urltitle
有8个值位,对于您的实现几乎(但不是完全)确定,将unsigned char
值728.3转换为类型double
的行为是未定义的,由paragraph 6.3.1.4/1 of the standard指定:
当实数浮点类型的有限值转换为整数时 除了_Bool之外的类型,小数部分被丢弃(即, 值被截断为零)。如果是积分部分的值 不能用整数类型表示,行为是未定义的。
这适用于您的unsigned char
和w
。它不适用于您的y
,涵盖整数值之间转换的规则(即您的x
)也不同。
基本上,在C级别上没有答案可以解释为什么你会看到你所做的具体结果,也没有为什么我在运行你的代码时会看到不同的结果。行为未定义;我可以感谢它并没有成为一个流鼻涕的恶魔。