我看到一行代码,如下所示:
xxxxx = (uint16_t) -1;
为什么要将-1转换为无符号整型?这段代码得到的是什么?
谢谢!
发布于 2012-12-14 09:37:50
很明显,答案就在你的指尖。只需插入代码并逐步执行,您将看到将-1转换为16位无符号整数时所获得值。
结果,该值的two's complement为-1,即: 0xFFFF十六进制,或65535十进制。
至于使用这样的代码的实际原因,这只是一条捷径。或者,它可能只是为了满足类型兼容性要求。
如果您想知道come -1如何被强制转换为0xFFFF (65535),而不是像人们预期的那样可能是0或1,那么您必须理解这是因为C语言虽然是静态类型的,但在强制类型限制方面是相当自由的。这意味着它将很高兴地将任何内存位置转换为您告诉它的任意类型的数据。当然,如果使用不当,这可能会产生相当严重的后果,但权衡的是灵活性和由于缺乏严格的健全检查而导致的速度改进。这在几十年前设计C语言的时候是非常重要的,如果你正在为非常小的处理器编写代码,它仍然是非常重要的。
也就是说,如果你认为强制转换只是简单地说:“忽略你认为你知道的关于这个内存位置的数据,只要告诉我如果你把它读成一个无符号整数(<insert_your_type_here>__)会是什么意思”,如果你知道计算机通常将负数表示为二的补码(参见上文),那么现在答案应该是非常明显的:C是取内存中的值,并将其读回为无符号整数。
作为结束语。我应该指出,C不是唯一一种将-1转换为0xFFFF的语言,但即使是更强大的类型检查功能的现代语言也会这样做,可能是出于兼容性和连续性的原因,也是因为它可以将转换: 0xFFFF转换回有符号的16位整数is -1。
发布于 2012-12-14 09:36:30
它将返回可能的最大无符号16位整数。
发布于 2012-12-14 09:39:23
它返回65535,这是两个字节(16位)无符号整数的最大值。
https://stackoverflow.com/questions/13871420
复制相似问题