C/C++使用int或unsigned int

dev*_*bmw 28 c c++ int unsigned types

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

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

for(int i = 0; i < length; i++)
{
    // Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

为什么你会使用一个int而不是一个unsigned int?这只是懒惰 - 人们不会打字打扰unsigned吗?

Pau*_*kin 22

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

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

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

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

使用unsigned引入了这些类型的错误的潜力,并没有任何好处.

  • 在我看来,这些只是人们现在如何知道如何*正确*使用他们选择的工具(或错误的选择本身)的一些例子......这两个例子都不是 unsigned int 的错,而是程序员 *想要的错* 使用无法生成的工具生成 *negative* 值。尝试用螺丝刀拧紧螺母,您可能会失败。螺丝刀仍然是一个有用的工具——或者你会否认吗? (3认同)
  • 如果使用unsigned int作为i的类型,那么i> = 0被报告为编译器警告已经十年了.甚至,按照你的例子,如果'5'是一个数组的大小,通常是size_t类型(无符号),并且为了没有警告(或强制转换),unsigned int和forward循环可能是需要. (2认同)

use*_*003 10

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

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

恕我直言,断言使用"int"比使用"unsigned int"更安全是完全错误的并且是一种糟糕的编程习惯.

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

  • 我发现这里的一些反应令人担忧.使用int因为它会掩盖编程错误是可怕的. (7认同)
  • 其他答案中的“编程错误”仅是使用无符号整数时的编程错误,而如果使用无符号整数则是完全明智的代码。 (3认同)
  • @Aconcagua:事实是,错误是由于编写错误的代码造成的。您可以对goto或null指针或任何其他容易出错的编程构造/工具进行相同的论点。 (2认同)

she*_*lbc 5

我选择在编程时尽可能明确。也就是说,如果我打算使用其值始终为正的变量,则unsigned可以使用。这里有许多提到“难以发现的错误”,但是很少给出示例。考虑下面的倡导者示例使用unsigned,与这里的大多数帖子不同:

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);
Run Code Online (Sandbox Code Playgroud)

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

在第二种情况下,您实际上会在运行时捕获到这一点,因为force的thing_ID符号性会强制条件代码执行无符号比较

当然,您可以做类似的事情other_safe_function,但这似乎更倾向于使用带符号的整数,而不是更明确地使用无符号的整数。