从我记事起,我就一直这样做:
for (unsigned int i = 0U; i < 10U; ++i)
{
// ...
}
换句话说,我对无符号整数使用了 U
说明符。现在看了这个太久了,我想知道我为什么要这样做。除了表示意图之外,我想不出它在像这样的琐碎代码中有用的原因?
我应该继续使用这个约定是否有一个有效的编程原因,或者它是否多余?
最佳答案
首先,我将说明您可能显而易见的内容,但您的问题留有余地,因此我确保我们都在同一页上。
无符号整数和常规整数之间有明显的区别:它们的范围不同(int32 为 -2,147,483,648 到 2,147,483,647,uint32 为 0 到 4,294,967,295)。当您使用正确的位移位 >>>
运算符时,将哪些位放在最高位是不同的。
当您需要告诉编译器将常量值视为 uint 而不是常规 int 时,后缀很重要。如果常量在常规 int 的范围之外但在 uint 的范围内,这可能很重要。如果您不使用 U
后缀,编译器可能在这种情况下抛出警告或错误。
除此之外,Daniel Daranas 在评论中提到唯一发生的事情:如果您不使用 U
后缀,您将隐式地将常量从常规 int 转换为 uint .这对编译器来说是一点点额外的努力,但没有运行时差异。
你应该关心吗?这是我的回答(粗体,对于那些只想快速回答的人):确实没有充分的理由将常量声明为 10U
或 0U
。 大多数时候,您处于 uint 和 int 的公共(public)范围内,因此无论是 uint 还是 int,该常量的值看起来都完全相同。编译器将立即采用您的 const int 表达式并将其转换为 const uint。
也就是说,这是我可以为另一方提供的唯一论据:语义。使代码在语义上连贯是很好的。在这种情况下,如果您的变量是一个 uint,将该值设置为常量 int 就没有意义。如果你有一个 uint 变量,那显然是有原因的,它应该只适用于 uint 值。
不过,这是一个非常无力的论据,特别是因为作为读者,我们接受 uint 常量通常看起来像 int 常量。我喜欢一致性,但使用“U”没有任何好处。
关于c - 用 "U"指定无符号整数有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43740911/