双签。这意味着第一位(最高有效位又名符号位)确定该数字是正数还是负数。
unsigned int 无法处理负值,因为它使用第一位(最高有效位)来扩展它可以表示的“正”数的范围。所以在
double d1 = -2 * a * b;
执行时,您的机器将整个 (-2 * a * b) 放入无符号 int 结构(如 a 和 b)中,并生成以下二进制 1111 1111 1111 1111 1111 1111 1001 0000 (因为它是 112 的二进制补码是 0000 0000 0000 0000 0000 0000 0111 0000)。但这里的问题是它是无符号整数,因此它被视为一个非常大的正整数(即 4294967184),因为它不会将第一个 1 视为符号位。
然后你把它放在一个双倍中,这就是你打印 .00000 的原因。
另一个示例之所以有效,是因为您将 a 类型转换为 double 并将 b 类型转换为 double,因此当将 -2 与 double 相乘时,您的计算机会将其置于 double 结构中,因此将考虑符号位。
double d3 = -2 * (double) (a * b)
也会起作用。
要了解已签名和未签名的内容,请查看此