自从我开始用C语言编程已经有一段时间了,但是,我仍然对unsigned
感到困惑。如果我们编译了这段代码:
#include <stdio.h>
int main(int argc, char **argv)
{
unsigned int x = -1;
return 0;
}
gcc和VC ++都不会引发任何错误甚至是关于在unsigned
使用负数的警告。
我的问题是,unsigned
做任何内部工作,或只是 提示 给程序员这个值不应该为负数?
答案 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
不是static
,extern
,const
或inline
等限定符。它是该类型的一部分。
int
和unsigned int
是两种完全不同的类型。您永远不会找到可以包含负数的unsigned int
。另请注意,int
和signed 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时,编译器会选择它们。