RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 627706
Accepted
Alerr
Alerr
Asked:2020-02-14 20:08:15 +0000 UTC2020-02-14 20:08:15 +0000 UTC 2020-02-14 20:08:15 +0000 UTC

既然有int,为什么还需要long类型呢?

  • 772

C有一个类型long。根据:Wiki c-types会在内存中占用4个字节,其取值范围与int. 那为什么需要呢?

维基摘录:

int:

有符号整数的基本类型。可以包含 [−32767, +32767] 范围内的数字。range;[3][4] 所以它至少是 16 位(2 字节)。实际上,在所有现代编译器中,它的大小为 4 个字节,范围为 [-2147483648, +2147483647]

long:

有符号长整型。可以包含至少在 [−2 147 483 647, +2 147 483 647].[3][4] 范围内的数字 所以它至少是 32 位(4 字节)。

c
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. αλεχολυτ
    2020-02-14T20:39:20Z2020-02-14T20:39:20Z

    类型的大小int不受long语言标准的约束。但是它们的大小比例是有规定的,即 sizeof(int)<= sizeof(long)。

    目前,我们可以说大小long取决于处理器的位数和所使用的操作系统。例如,对于 Linux 和 MacOS,64 位架构为 8 个字节,32 位架构为 4 个字节。在 Windows 上,无论体系结构的位数如何,大小都是 4 个字节。

    例如,C++ 标准甚至有这个例子:

    static_assert(sizeof(long) >= 8, "64-bit code generation required for this library.");
    

    例如,您可以使用不同的类型来提供函数重载:

    void f(int) {}
    void f(long) {}
    f(42); // int
    f(42L); // long
    

    另外,不要忘记这些类型具有不同的等级(整数转换等级),这会影响转换整数类型的规则。

    在来自cygwin 页面的@AnTlong的评论之后对维度的澄清:

    Mingw 和 Microsoft 编译器使用 LLP64 数据模型,而 Cygwin 编译器使用 LP64 数据模型,就像 Linux 一样。这会影响 long 类型的大小。在 Microsoft 首选的 LLP64 模型中,sizeof(long) 为 4。这也适用于相关的 Win32 类型,如 LONG、ULONG、DWORD 等。

    在 Cygwin 使用的 LP64 模型中,sizeof(long) 是 8,就像指针的大小或类型 size_t/ssize_t 一样。这简化了将 Linux 应用程序移植到 64 位 Cygwin,但在调用采用 LONG、ULONG、DWORD 或任何其他等效类型的 Windows 函数时需要尽职调查。这在与指针结合时尤为重要。

    • 19
  2. Best Answer
    Vlad from Moscow
    2020-02-14T21:14:27Z2020-02-14T21:14:27Z

    处理器的发展逐渐增加了寄存器的容量。例如,之前的DOS类型int对应于 16 位整数值,因为在 IBM 兼容计算机上寄存器是 16 位的。例如,一个寄存器AX的长度为 16 位,其子寄存器AL的AH位宽为 8 位。在此之前,一般来说,处理器寄存器都是 8 位的。

    例如,如果您执行两个 16 位类型的对象的乘法运算int,那么您需要使用两个寄存器来存储结果,例如寄存器AX和DX。对于这个结果,您已经需要引入一个新的整数类型。并引入了这种类型。这是类型long。

    然后是 64 位处理器。您必须区分 16 位整数、32 位整数和 64 位整数。因此,引入了一个额外的整数类型Long long。请记住,有必要保持与先前为具有较低位深度的处理器引入的整数类型的向后兼容性。

    因此,C 标准假定

    sizeof( short ) <= sizeof( int )
    sizeof( int ) <= sizeof( long )
    sizeof( long ) <= sizeof( long long )
    

    long编译器开发人员可以自由选择类型和其他整数类型的位宽。比如一个类型的位宽long可能不是`32位,而是64位。

    为了使程序可移植,有必要引入具有严格指定位深度的新类型,例如 int_least32_t 或 int32_t。

    在某些 64 位平台上,typelong和 typelong long可能是 64 位宽的。在其他 64 位平台上,typelong可以是 32 位,typeint也可以是 32 位,type 可以是long long64 位。

    但是,typelong long的等级大于 type 的等级long,而 typelong的等级又高于 type int。

    表达式中类型转换的规则就是基于此。例如,如果 typelong和 typeint都是 32 位宽,那么在下面的代码片段中

    long x = 0;
    unsigned int y = 0;
    
    x + y;
    

    表达式x + y的类型是 类型unsigned long。

    在这方面,有一些与此类转换相关的好奇心,尤其是在选择 C++ 中的重载函数时。

    下面的主题描述了一个这样的例子,在接近尾声的地方(您可以通过关键字快速找到这篇文章int64_t)描述了一个这样的好奇心,它与调用参数类型为 的重载函数有关std::int64_t,当它变成out,不是 type 的别名long long int,而是 type 的别名,long int在此平台上是 64 位的。

    • 17
  3. AnT stands with Russia
    2020-02-14T22:42:30Z2020-02-14T22:42:30Z

    该类型long不会“占用内存中的 4 个字节”。它至少需要 32 位,即 范围至少为[−2147483647, +2147483647]. 从上面看,它的大小不受限制。

    该类型int至少需要 16 位,因为它至少有一个范围[−32767, +32767](正如您自己注意到的)。

    因此,尚不完全清楚您从哪里得到这些类型的范围相同的假设 - 从您引用的内容中可以清楚地看出它们很容易不同。

    在 C++ 中,整数类型系统具有以下属性

    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
    

    那些。这些类型的大小(和范围)很可能都不同。

    在 C 语言中,由于某些历史原因,这个比率被定义为

    диапазон(signed char) ⊆ диапазон(short) ⊆ диапазон(int) ⊆ диапазон(long) ⊆ диапазон(long long)
    

    但是,当然,这两种情况的想法是相同的。所有这些类型在范围方面都可能不同。但是,因为它们在大小和范围方面都可以相同。

    事实上,在某些平台上,您具有long与该类型相同的类型表示,这int只是您平台的一个特性。

    • 6
  4. qwerty ytrewq
    2020-02-14T20:38:18Z2020-02-14T20:38:18Z

    C 语言为您提供了许多类型。特别是,保证 int 不大于 long。并且 long 不大于 long long。您可以根据自己的需要和方便进行选择。

    当一个类型被频繁使用时,编译器会针对它进行优化。在编译器中进行优化后,他们开始推荐出于某种目的使用该类型。

    在不同的计算机体系结构上,处理器寄存器的大小不同,但类型大小的比例保持不变。

    简单来说:在程序中经常使用int,所以在PC上被拉长到4字节大小,对应x32处理器寄存器。long 并没有开始提取最多 8 个字节,因为在 x32 上,需要向处理器发送两条命令而不是一条。但是不要删除long,因为有些程序会用到它。

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5