3

我看到了这样一行代码:

xxxxx = (uint16_t) -1;

为什么将 -1 转换为无符号整数?这个代码是什么?

谢谢!

4

3 回答 3

5

它将返回可能的最高无符号 16 位整数。

于 2012-12-14T01:36:29.923 回答
5

显然,答案触手可及。只需插入该代码并逐步执行,您将看到将 -1 转换为 16 位无符号整数时获得的值。

结果是 -1的二进制补码,即: 0xFFFF hex或 65535 decimal

至于使用这样的代码的实际原因,它只是一个捷径。或者也许只是为了满足类型兼容性要求。

如果您想知道 -1 为何会被强制转换为 0xFFFF (65535) 而不是 0 或 1,正如人们所期望的那样,您必须了解其原因是 C 语言虽然是静态类型的,但非常自由在执行类型限制时。这意味着它会很高兴地将任何内存位置转换为 - 或解释为您告诉它的任何任意类型的数据。如果使用不当,这当然会产生非常严重的后果,但由于缺乏严格的健全性检查,权衡是灵活性和速度提高。几十年前设计 C 语言时,这一点非常重要,如果您正在为非常小的处理器编写代码,这一点仍然很重要。

话虽如此,如果您将演员表视为简单地说:“忽略您认为您对该内存位置的数据了解的情况,请告诉我,如果您将其读取为<insert_your_type_here>并且知道计算机通常将负数表示为二进制补码(见上文),那么答案现在应该很明显:C 正在将内存中的值作为无符号整数读回。

作为结束语。我应该指出,C 并不是唯一一种将 -1 转换为 0xFFFF 的语言,但更现代的能够进行更强类型检查的语言也会这样做,这可能是出于兼容性和连续性的原因,以及它的原因可以反转强制转换:0xFFFF 回到有符号的 16 位整数为 -1。

于 2012-12-14T01:37:49.737 回答
1

它返回 65535,这是一个两字节(16 位)无符号整数的最大值。

于 2012-12-14T01:39:23.050 回答