什么是无符号数据类型?

时间:2009-07-23 13:44:37

标签: c types unsigned

我已经看过这种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,还是仅仅是编译器扩展?

7 个答案:

答案 0 :(得分:132)

unsigned实际上是unsigned int的简写,在标准C中定义。

答案 1 :(得分:29)

unsigned表示unsigned intsigned表示signed int。仅使用unsigned是一种在C中声明unsigned int的懒惰方式。是的,这是ANSI。

答案 2 :(得分:12)

历史上在C中,如果省略了数据类型,则假定为“int”。所以“unsigned”是“unsigned int”的简写。这已经被认为是很长时间的不良做法,但仍有相当数量的代码使用它。

答案 3 :(得分:7)

在C中,unsignedunsigned 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 aunsigned 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的情况下,我们可以写unsignedunsigned int,也可以在发疯的情况下写int unsigned。后者由于该标准足够愚蠢,以至于“ ...可能以任何顺序发生,可能会混杂在一起”。这是该语言的已知缺陷。

正确的C代码使用unsigned int