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

Eri*_*icS 1 c

为什么将双重728.3转换为无符号字符会产生零?728是0x2D8,所以不应该w0xD8(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
Run Code Online (Sandbox Code Playgroud)

too*_*ite 7

从C标准6.3.1.4p1:

当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.

因此,除非你有> = 10位,否则你unsigned char的代码会调用未定义的行为.

请注意,强制转换显式告诉编译器您知道自己在做什么,因此会抑制警告.

  • @EricS是因为演员阵容击败了编译器警告,并且是演员阵容危险的原因之一. (2认同)