我已经看过这种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,还是仅仅是编译器扩展?
答案 0 :(得分:132)
unsigned
实际上是unsigned int
的简写,在标准C中定义。
答案 1 :(得分:29)
unsigned
表示unsigned int
。 signed
表示signed int
。仅使用unsigned
是一种在C中声明unsigned int
的懒惰方式。是的,这是ANSI。
答案 2 :(得分:12)
历史上在C中,如果省略了数据类型,则假定为“int”。所以“unsigned”是“unsigned int”的简写。这已经被认为是很长时间的不良做法,但仍有相当数量的代码使用它。
答案 3 :(得分:7)
在C中,unsigned
是unsigned int
的快捷方式。
long
<{1}}的快捷方式与long int
也可以声明unsigned long
(它将是unsigned long int
)。
这是ANSI标准
答案 4 :(得分:3)
在C和C ++中
unsigned = unsigned int (Integer type)
signed = signed int (Integer type)
包含n位的无符号整数可以具有0到0之间的值 (2 ^ n-1),这是2 ^ n个不同的值。
无符号整数为正或零。
有符号整数使用2的补码存储在计算机中。
答案 5 :(得分:1)
带我的answer from another question。
来自C specification,第6.7.2节:
- unsigned,或unsigned int
意味着unsigned
未指定类型时,默认为unsigned int
。因此,撰写unsigned a
与unsigned int a
相同。
答案 6 :(得分:1)
根据C17 6.7.2§2:
每个类型说明符列表应为以下多个集合之一(当每个项目有多个集合时,用逗号分隔);类型说明符可以以任何顺序出现,并且可能与其他声明说明符混合在一起
—无效
— char
—签名的字符
—未签名的字符
— short,有符号的short,short int或有符号的short int
—无符号短整数或无符号短整数int
— int,已签名或已签名int
—无符号或无符号int
— long,signed long,long int或signed long int
— unsigned long或unsigned long int
— long long,signed long long,long long int或signed long long int
— unsigned long long,或unsigned long long int
—浮动
—双
—长双
— _Bool
— float _Complex
— double _Complex
— long double _Complex
—原子类型说明符
—结构或联合说明符
—枚举说明符
— typedef名称
因此,在unsigned int
的情况下,我们可以写unsigned
或unsigned int
,也可以在发疯的情况下写int unsigned
。后者由于该标准足够愚蠢,以至于“ ...可能以任何顺序发生,可能会混杂在一起”。这是该语言的已知缺陷。
正确的C代码使用unsigned int
。