100

我已经看到这种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 位无符号整数)
- 它可以用作将另一种类型转换为无符号版本的速记:

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

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

4

7 回答 7

160

unsigned真的是 , 的简写unsigned int,因此在标准 C 中定义。

于 2009-07-23T13:46:39.117 回答
39

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

于 2009-07-23T13:48:33.873 回答
19

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

于 2009-07-23T13:49:31.500 回答
10

在 C 中,unsignedunsigned int.

你有同样的,long这是一个快捷方式long int

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

这是在 ANSI 标准中

于 2009-07-23T13:49:27.710 回答
5

在 C 和 C++ 中

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

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

无符号整数是正数或零。

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

于 2015-02-04T06:51:54.617 回答
2

根据 C17 6.7.2 §2:

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

— void
— char
— signed char
— unsigned char
— short、signed short、short int 或 signed short int
— unsigned short 或 unsigned short int
— int、signed 或 signed int
— unsigned 或 unsigned int
— long、signed long , long int, or signed long int
— unsigned long, or unsigned long int
— long long, signed long long, long long int, or signed long long int
— unsigned long long, or unsigned long long int
— float
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
— 原子类型说明符
— 结构或联合说明符
— 枚举说明符
— typedef 名称

因此,如果unsigned int我们可以写unsignedunsigned int,或者如果我们感觉很疯狂,int unsigned。后者因为标准是愚蠢到允许“......可能以任何顺序发生,可能是混合的”。这是该语言的一个已知缺陷。

正确的 C 代码使用unsigned int.

于 2018-08-09T14:05:53.970 回答
1

从另一个问题带来我的答案

C 规范,第 6.7.2 节:

— 无符号或无符号整数

这意味着unsigned,当未指定类型时,应默认为 unsigned int。所以写法unsigned a是一样的unsigned int a

于 2017-01-04T19:27:55.337 回答