将double转换为unsigned char时出现问题

时间:2017-06-16 17:18:09

标签: c

为什么将双重728.3转换为无符号字符会产生零? 728是0x2D8,所以不应该w0xD8216)?

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

2 个答案:

答案 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 charw。它不适用于您的y,涵盖整数值之间转换的规则(即您的x)也不同。

基本上,在C级别上没有答案可以解释为什么你会看到你所做的具体结果,也没有为什么我在运行你的代码时会看到不同的结果。行为未定义;我可以感谢它并没有成为一个流鼻涕的恶魔。