为什么这样投? “(uint16_t)-1;”

时间:2012-12-14 01:34:59

标签: c

我看到了一行代码:

xxxxx =(uint16_t)-1;

为什么将-1转换为unsigned int?这段代码是什么?

谢谢!

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

该值的结果为two's complement -1,即:0xFFFF hex ,或65535 decimal

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

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

话虽如此,如果您认为某个演员只是简单地说:“忽略您认为您对此内存位置的数据的了解,请告诉我如果您将其视为{{{ 1}}“如果你知道计算机通常将负数表示为两个补码(见上文),那么现在答案应该非常明显:C在内存中取值并将其作为无符号整数读回

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

答案 2 :(得分:1)

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