什么是无符号数据类型?


90

我见过这种unsigned“无类型”类型使用过几次,但从未见过对此的解释。我想有一个对应的signed类型。这是一个例子:

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

到目前为止,我已经收集了以下内容:
-在我的系统上sizeof(unsigned) = 4((32位无符号int的提示)
-它可以用作将另一种类型转换为无符号版本的简写:

signed long int i = -42;
printf("%u\n", (unsigned)i);

这是ANSI C,还是仅仅是编译器扩展?

Answers:



30

unsigned意味着unsigned intsigned意味着signed int。使用justunsignedunsigned int在C中声明in的一种懒惰方式。是的,这是ANSI。


14

历史上在C中,如果省略了数据类型,则假定为“ int”。因此,“ unsigned”是“ unsigned int”的简写。长期以来,这种做法一直被认为是不好的做法,但是仍然有大量使用它的代码。


6
我不知道这是不好的做法。有这个理由吗? long而不是代替long int是很常见的,所以我不确定为什么不能接受unsigned代替unsigned int
CB Bailey 2009年

10
@Charles Bailey:如今-至少在您务实而非正式的情况下-long,int,short和char被认为是不同的数据类型,因为它们可以是不同的大小,而unsigned(默认情况下,signed)是限定词。因此,您倾向于以与使用“ unsigned long”或“ unsigned char”相同的方式来使用“ unsigned int”(这很清楚,您并非只是错过了int)。“长整数”或“短整数”中的整数是多余的。
油尺

1
@Dipstick,“ long”是“ int”的限定词。似乎“ unsigned int”中的int与“ unsigned long int”中的int一样多余。
康拉德·迈耶

1
这与隐式“ int”规则不同。这个答案是误导的。

7

在C中,unsigned是的快捷方式unsigned int

您拥有相同long的快捷方式long int

并且也可以声明a unsigned long(它将是unsigned long int)。

这是ANSI标准


是。unsigned与相同,unsigned int但我在WG14 / N1124委员会草案中进行了搜索-2005年5月6日ISO / IEC 9899:TC2unsigned但找不到定义的地方...您可以援引其定义的部分吗?
user454322 2014年

5

在C和C ++中

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

包含n位的无符号整数可以具有介于0和(2 ^ n-1)之间的值,这是2 ^ n个不同的值。

无符号整数可以为正或为零。

有符号整数使用2的补码存储在计算机中。


2

根据C17 6.7.2§2:

类型说明符的每个列表应为以下多个集合之一(当每个项目有多个集合时,用逗号分隔);类型说明符可以以任何顺序出现,并且可能与其他声明说明符混合

—无效
— char
—带符号的char
—无符号的char
—短,带符号的short,short int或signed short int
—无符号的short或unsigned short int
— int,带符号的或有符号的int
— unsigned或unsigned int
—长的,带符号的long ,long int或有符号long int-
无符号long或unsigned long int
-long long,有符号long long,long long int或有符号long long int-
无符号long long或无符号long long int
-float
-double
-long double
— _Bool
—浮点数_Complex
— double _Complex
— long double _Complex
—原子类型说明符
—结构或联合说明符
—枚举说明符
— typedef名称

因此,在这种情况下,unsigned int我们可以写unsignedunsigned int,或者如果我们感到疯狂,int unsigned。后者由于标准愚蠢到足以允许“ ...可能以任何顺序发生,可能混合在一起”。这是该语言的已知缺陷。

正确的C代码使用unsigned int


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.