【问题标题】:what is the difference between short signed int and signed intshort signed int 和 signed int 有什么区别
【发布时间】:2010-07-15 08:10:22
【问题描述】:

我指的是关于 c 的教程,我发现signed int 和 short signed int 范围是 -32768 到 32767,它有 2 个字节,如果不是,那么为什么使用两种声明。

【问题讨论】:

  • 哪个教程教你这个?
  • 这是一个非常糟糕的教程。它不仅在教授特定于实施的废话,而且是在 15 年内过时的特定于实施的废话。
  • 那是“短”范围过时的:)。
  • 嗯,将 -32767 作为负限制稍作修改,这些 C 标准最小范围,对于编写真正可移植的代码来说了解这些范围很重要。跨度>

标签: c


【解决方案1】:

它是特定于平台的 - 在这种情况下,您可以确定的只有 sizeof(int) >= sizeof(short) >= 16 bits

【讨论】:

  • 它是特定于平台的。但是,根据标准,符合标准的实现应该强制执行较低的限制。 (另请参阅下面的答案)。
  • @Vijay:如果您仔细阅读我上面写的内容,您应该会发现它涵盖了这些下限。
  • 不,就 C 而言,您永远无法确定 sizeof(short)>=2char 可能是 32 位甚至 64 位,然后所有类型的大小都为 1(可能 long long 除外)。但是,您确实可以保证char 至少为 8 位,shortint 至少为 16 位,long 至少为 32 位,long long 为至少 64 位。自然的<= 关系也适用于连续“更大”的类型。
  • @R..: 好点子 - 我在写“2”时暗示 “2 8 位字节”,但我应该更加小心 - 我会编辑答案以解决此问题。
【解决方案2】:

您的问题的最佳答案可以在 C 的 ANSI 标准中找到,第 2.2.4.2 节 - 数值限制。为了您的方便,我在此处复制了该部分的相关部分:

2.2.4.2 数值限制

一个符合要求的实现应该 记录中指定的所有限制 本节,应指定 在标题和 .

“整数类型的大小”

下面给出的值应为 替换为常量表达式 适用于#if 预处理 指令。他们的 实现定义的值应为 大小相等或更大 (绝对值)到那些显示,与 相同的标志。

  • 最小的最大位数 不是位域(字节)的对象 CHAR_BIT 8

  • 类型对象的最小值 有符号字符 SCHAR_MIN
    -127

  • 类型对象的最大值 有符号字符 SCHAR_MAX
    +127

  • 类型对象的最大值 无符号字符 UCHAR_MAX
    255

  • 类型对象的最小值 char CHAR_MIN 见 下面

  • 类型对象的最大值 char CHAR_MAX 见 下面

  • a 中的最大字节数 多字节字符,对于任何支持的 语言环境 MB_LEN_MAX
    1

  • 类型对象的最小值 短整数 SHRT_MIN
    -32767

  • 类型对象的最大值 短整数 SHRT_MAX
    +32767

  • 类型对象的最大值 无符号短整数 USHRT_MAX
    65535

  • 类型对象的最小值 int INT_MIN
    -32767

  • 类型对象的最大值 int INT_MAX
    +32767

  • 类型对象的最大值 无符号整数 UINT_MAX
    65535

  • 类型对象的最小值 long int LONG_MIN
    -2147483647

  • 类型对象的最大值 长 int LONG_MAX
    +2147483647

  • 类型对象的最大值 无符号长整数 ULONG_MAX
    4294967295

实现不那么广泛的 C99 添加了以下数字类型:

  • long long int 类型对象的最小值 LLONG_MIN -9223372036854775807 // -(263 - 1)
  • long long int 类型对象的最大值 LLONG_MAX +9223372036854775807 // 263 - 1
  • unsigned long long int 类型对象的最大值 ULLONG_MAX 18446744073709551615 // 264 - 1

【讨论】:

    【解决方案3】:

    其他几个答案正确引用了 C 标准,该标准对类型设置了最小范围。但是,如您所见,short intint 的最小范围相同 - 所以问题仍然存在:为什么 short intint 不同?我什么时候应该选择一个而不是另一个?

    提供int 的原因是提供一种类型,旨在匹配相关硬件上“最有效”的整数类型(仍满足最低要求范围)。 int 是您应该在 C 中使用的通用小整数类型 - 它应该是您的默认选择。

    如果您知道需要比 -32767 到 32767 更大的范围,则应改为选择 long intlong long int。如果您存储大量小整数,这样空间效率比计算效率更重要,那么您可以选择short(甚至signed char,如果您知道您的值将适合-127到127 范围)。

    【讨论】:

      【解决方案4】:

      C 和 C++ 仅对其对象进行最小大小保证。没有确切的尺寸保证。您不能依赖类型 short 正好是 2 个字节,只能依赖它可以保存指定范围内的值(因此它至少是两个字节)。 int 类型至少与 short 一样大,并且通常更大。请注意,signed int 是一种冗长的说法 intsigned short int 是一种冗长的说法 short int 是一种冗长的说法 short。除了 char 类型(某些编译器会将其设为无符号类型)外,所有内置整数类型默认都是有符号的。 short intlong int 类型分别是 shortlong 的较长方式。

      【讨论】:

        【解决方案5】:

        signed int 至少与short signed int 一样大。在大多数现代硬件上,short int 是 2 个字节(如您所见),而普通的 int 是 4 个字节。较旧的架构通常有一个 2 字节的 int,这可能是您感到困惑的原因。

        还有一个long int,通常为 4 或 8 个字节,具体取决于编译器。

        【讨论】:

        • 那么在旧架构中,signed int 和 short signed int 是一样的吗?
        【解决方案6】:

        请阅读以下对签名字符的说明,然后我们将讨论有符号/无符号整数。

        首先,我想为您的问题准备背景。
        ................................................

        char 数据类型有两种:

        无符号字符;

        签名字符;

        (即积分数据类型)

        .................................................. ..

        根据不同的书籍解释为:
        char 1byte –128 到 127(即默认有符号字符)

        signed char 1byte –128 到 127

        unsigned char 1byte 0 到 255

        .................................................. ..

        还有一件事 1byte=8 位。(零到第 7 位)

        由于处理器标志寄存器保留第 7 位用于表示符号(即 1=+ve & 0=-ve)


        -37 将表示为 1101 1011(最高有效位为 1),

        +37 将表示为 0010 0101(最高有效位为 0)。


        .................................................. ..

        类似地,char 的最后一位默认被视为已签名


        这就是为什么?

        因为 char 还依赖于特定字符的 ASCII 码(例如 A=65)。


        在任何情况下,我们都使用 char 并且仅使用 7 位。

        在这种情况下,为了将 char/int 的内存范围增加 1 位,我们使用 unsigned char 或 unsigned int;

        感谢您的提问。

        类似地,对于 4bit int 或 2bit int,我们需要有符号整数和无符号整数

        【讨论】:

          【解决方案7】:

          这取决于平台。

          Int 在 32 位系统上为 32 位宽,而在 64 位系统上为 64 位宽(我确信情况永远如此)。

          【讨论】:

          • x86-64 在 64 位硬件上通常是 32 位 int,IA64 是 64 位 int,有几种不同的模型:unix.org/version2/whatsnew/lp64_wp.html
          • 这取决于 C 实现。在“LP64”实现中,整数是 32 位,长整数是 64 位,指针是 64 位。在 ILP64 实现中,整数也是 64 位的。
          【解决方案8】:

          我指的是关于 c 的教程,我发现有符号整数和短符号整数范围是 -32768 到 32767,它是 2 个字节。

          这是一个非常古老的教程。现代 C 标准是根据 Paul R 的回答。在 32 位架构上,通常:

              short int is 16 bits
                    int is 32 bits
               long int is 32 bits
          long long int is 64 bits
          

          int 的大小在 16 位机器上通常只有 16 位。如今,16 位机器可能仅限于嵌入式设备。

          在 16 位机器上,大小可能是这样的:

              short int is 16 bits
                    int is 16 bits
               long int is 32 bits
          long long int is 64 bits
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-30
            • 1970-01-01
            • 2011-07-02
            相关资源
            最近更新 更多