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

Joe*_*e.Z 3 c

我看到一行代码如下:

xxxxx =(uint16_t)-1;

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

谢谢!

Dru*_*erB 5

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


Mik*_*scu 5

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

该值结果为-1 的二进制补码,即:0xFFFF 十六进制或65535 十进制.

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

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

话虽这么说,如果你认为一个演员简单地说:"忽略你认为你对这个记忆位置的数据有什么了解,只要告诉我如果你把它读作<insert_your_type_here>" 是什么意思",如果你知道计算机通常将负数表示为两个补码(见上文)然后答案应该非常明显:C在内存中取值并将其作为无符号整数读回.

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