【问题标题】:what is the unsigned datatype?什么是无符号数据类型?
【发布时间】:2021-08-17 06:39:04
【问题描述】:

我已经看到这种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,还是只是一个编译器扩展?

【问题讨论】:

    标签: c types unsigned


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我不知道这是不好的做法。这有什么理由吗? long 代替 long int 很常见,所以我不知道为什么 unsigned 代替 unsigned int 是不可接受的。
        • @Charles Bailey:这些天来——至少如果你是务实而不是正式的——long、int、short 和 char 被认为是不同的数据类型,因为它们可以是不同的大小)与 unsigned (和默认,签名)是一个限定符。因此,您倾向于以与使用“unsigned long”或“unsigned char”相同的方式使用“unsigned int”(这清楚地表明您并没有错过int)。 “long int”或“short int”中的int是多余的。
        • @Dipstick,“long”是“int”的限定符。似乎“unsigned int”中的 int 与“unsigned long int”中的 int 一样多余。
        • 这与隐含的“int”规则不同。这个答案具有误导性。
        【解决方案4】:

        在 C 中,unsignedunsigned int 的快捷方式。

        long 具有相同的含义,即 long int 的快捷方式

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

        这是在 ANSI 标准中

        【讨论】:

        • 是的。 unsignedunsigned int 相同,但我在 WG14/N1124 委员会草案 — 2005 年 5 月 6 日 ISO/IEC 9899:TC2 上搜索了unsigned,但找不到在哪里定义...你能引用它定义的部分吗?
        【解决方案5】:

        在 C 和 C++ 中

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

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

        无符号整数要么是正数,要么是零。

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

        【讨论】:

          【解决方案6】:

          根据 C17 6.7.2 §2:

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

          ——无效
          — 字符
          — 带符号的字符
          — 无符号字符
          — short、signed short、short int 或 signed short int
          — unsigned short 或 unsigned short int
          — int、signed 或 signed int
          — 无符号或无符号整数
          — long、signed long、long int 或 signed long int
          — unsigned long 或 unsigned long int
          — long long、带符号的 long long、long long int 或带符号的 long long int
          — unsigned long long 或 unsigned long long int
          — 浮动
          — 双
          — 长双
          — _布尔
          — 浮动 _Complex
          — 双 _Complex
          — 长双 _Complex
          — 原子类型说明符
          — 结构或联合说明符
          — 枚举说明符
          — typedef 名称

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

          正确的 C 代码使用unsigned int

          【讨论】:

            【解决方案7】:

            带上我的answer from another question

            来自C specification,第 6.7.2 节:

            ——无符号或无符号整数

            意思是unsigned,当没有指定类型时,默认为unsigned int。所以写unsigned aunsigned int a是一样的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-09-28
              • 2018-12-18
              • 2011-05-26
              • 2013-03-19
              • 2017-04-05
              • 1970-01-01
              • 2016-08-16
              相关资源
              最近更新 更多