我是一个C语言初学者,需要快速澄清关于整数的问题。
当你将某些东西转换为 int 类型时,它是 32 位的,其中一半的位用于负整数。因此,如果您知道您只会使用正整数,那么将其转换为 unsigned int 类型应该最大化您的正整数位,因此在了解输出始终为正时更有意义。这是真的吗?
谢谢!
我是一个C语言初学者,需要快速澄清关于整数的问题。
当你将某些东西转换为 int 类型时,它是 32 位的,其中一半的位用于负整数。因此,如果您知道您只会使用正整数,那么将其转换为 unsigned int 类型应该最大化您的正整数位,因此在了解输出始终为正时更有意义。这是真的吗?
谢谢!
半数比特用于负整数
这个说法是不正确的,对于普通整数只有一个比特位用于符号。
然而,您的假设是正确的。如果您确定数字是正数,则使用unsigned int
将允许您访问范围为[0,2^32)的数字,而常规int仅允许[-(2^31),2^31-1],因为您不需要负值,这会留下较少的正数。
[0,2^32)
(不包括2的32次方),而不是[0,2^32]
(包括2的32次方)。注意在书写数字范围时,方括号和小括号之间的差异。 - amit[0,2^32)
== [0,2^32-1]
。 - amit不是一半的位数,而是只有一个位,它可以转换成一半的值。也不是强制类型转换,而是声明:如果你强制类型转换某个东西,你正在重新解释它,这并没有给你额外的范围,它只会给你一个潜在的与原始用户意图不同的值。
仅使用一位来标识数字是正数还是负数。
转换为无符号数可能有意义,也可能没有。有时最好让调试器及其他工具显示负数,以便让您意识到您的数字已超出范围。
特别需要注意的是在比较无符号数时要小心 - 许多循环由于倒计时值是无符号的,而比较是 “<0” 导致无法终止。
一个比特用于表示正负,而非一半。使用无符号数字可以让你拥有比有符号等价物更大两倍的正值范围。