C中的未签名是否有任何内部工作?

时间:2012-09-02 16:21:38

标签: c unsigned

自从我开始用C语言编程已经有一段时间了,但是,我仍然对unsigned感到困惑。如果我们编译了这段代码:

#include <stdio.h>

int main(int argc, char **argv)
{
    unsigned int x = -1;

    return 0;
}

gcc和VC ++都不会引发任何错误甚至是关于在unsigned使用负数的警告。

我的问题是,unsigned做任何内部工作,或只是 提示 给程序员这个值不应该为负数?

7 个答案:

答案 0 :(得分:3)

这不仅仅是一个暗示。以下两个片段的行为应该不同:

签名:

int x = -1;
printf("%d\n", x > 0);  // prints 0

Unsigned int:

unsigned int x = -1;
printf("%d\n", x > 0);  // prints 1

你可能会提出另外5个签名很重要的例子。例如,使用>>运算符向右移动。

答案 1 :(得分:2)

使用-Wsign-conversion通过gcc收到警告。

使用gcc 4.7.1,-Wsign-conversion既不是-Wall也不是-Wextra的一部分。

另请注意,C标准不需要对此初始化发出警告。

答案 2 :(得分:2)

unsigned不是staticexternconstinline等限定符。它是该类型的一部分。

intunsigned int是两种完全不同的类型。您永远不会找到可以包含负数的unsigned int。另请注意,intsigned int的类型完全相同。对于char来说,这是一个略有不同的故事,但我会再将其留下。

-1分配给无符号整数是将其设置为它可以容纳的最大值的常用技巧。

答案 3 :(得分:0)

尝试通过以下方式启用gcc中的警告:gcc -Wall -o out input.c

unsigned int与普通int之间的另一个区别:int范围使用4字节:-2,147,483,648到2,147,483,647,unsigned范围使用4字节:0到4,294,967,295。您不必存储有关该符号的信息(最高位),因此您可以分配更大的值,并且应用程序将正常工作。

答案 4 :(得分:0)

unsigned会影响整数溢出,比较和按位移位行为。它不仅仅是一个“暗示”,它不应该是消极的。

答案 5 :(得分:0)

((unsigned int) -1)相当于(UINT_MAX)<limits.h>),因为保证通过模运算完成从负值到无符号值的转换。

  

C11§6.3.1.3有符号和无符号整数

     

2否则,如果新类型为unsigned,则转换为   重复加或减一个以上的最大值   可以用新类型表示,直到值在范围内   新类型。

答案 6 :(得分:-1)

有用于计算的内部(机器级)指令的有符号和无符号版本,例如乘法mul(对于无符号)和imul(已签名)。当您将变量声明为unsigned或signed时,编译器会选择它们。