C / C ++使用int或unsigned int

在很多代码示例,源代码,库等中我看到使用int时,就我所知,unsigned int会更有意义。

我看到的一个地方很多是for循环。 见下面的例子:

 for(int i = 0; i < length; i++) { // Do Stuff } 

为什么你会使用int而不是unsigned int? 这只是懒惰吗 – 人们不会因打字unsigned而烦恼吗?

使用unsigned可能会引入难以发现的编程错误,并且通常最好使用signed int来避免它们。 一个例子是当你决定向后迭代而不是向前迭代并写下这个:

 for (unsigned i = 5; i >= 0; i--) { printf("%d\n", i); } 

另一个是如果你在循环中做一些数学:

 for (unsigned i = 0; i < 10; i++) { for (unsigned j = 0; j < 10; j++) { if (i - j >= 4) printf("%d %d\n", i, j); } } 

使用unsigned引入这些类型的错误,并且没有任何好处。

这通常是懒惰或缺乏理解。

当值不应为负数时,我会使用unsigned int。 这也用于指定正确值应该是什么的文档目的。

恕我直言,断言使用“int”比使用“unsigned int”更安全是完全错误的,也是一种糟糕的编程习惯。

如果您使用过Ada或Pascal,您将习惯于使用更安全的方法来指定值的特定范围(例如,一个只能是1,2,3,4,5的整数)。

如果length也是int ,那么你应该使用相同的整数类型,否则在比较语句中混合有符号和无符号类型时会发生奇怪的事情。 大多数编译器会给你一个警告。

你可以继续问,为什么要签署length ? 嗯,这可能是历史性的。

此外,如果您决定反转循环,即

 for(int i=length-1;i>=0 ;i--) { // do stuff } 

如果使用无符号整数,则逻辑会中断。

我认为最重要的原因是如果你选择unsigned int ,你会得到一些逻辑错误。 实际上,您通常不需要unsigned int的范围,使用int更安全。

我选择在编程时尽可能明确。 也就是说,如果我打算使用其值始终为正的变量,则使用unsigned 。 许多人在这里提到“很难发现错误”但很少举例。 考虑以下使用unsigned主张示例,与此处的大多数post不同:

 enum num_things { THINGA = 0, THINGB, THINGC, NUM_THINGS }; int unsafe_function(int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int safe_function(unsigned int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int other_safe_function(int thing_ID){ if((thing_ID >=0 ) && (thing_ID >= NUM_THINGS)) return -1; ... } /* Error not caught */ unsafe_function(-1); /* Error is caught */ safe_function((unsigned int)-1); 

在上面的例子中,如果将负值作为thing_ID传入会发生什么? 在第一种情况下,您会发现负值不大于或等于 NUM_THINGS ,因此该函数将继续执行。

在第二种情况下,您实际上会在运行时捕获它,因为thing_ID的thing_ID强制条件执行无符号比较

当然,你可以做类似other_safe_function事情,但这似乎更像是使用有符号整数而不是更明确并使用无符号开头的other_safe_function

只有当length大于max int值时才使用unsigned int。 使用unsigned int可能会引入难以发现的错误,尤其是在长度可变的情况下。