C ILP32或LP64数据模型是由操作系统或硬件架构决定的吗?

C ILP32或LP64数据模型是由操作系统或硬件架构决定的吗?,c,types,compiler-construction,C,Types,Compiler Construction,我正在阅读C-(u)intN\u t中的固定大小数据类型 我知道,使用这些数据类型将确保程序员能够确保该数据类型的准确位数 我很好奇这是如何在内部实现的,经过一点研究,我了解到通过头文件,它们的定义如下- typedef char int8_t; typedef short int16_t; typedef long long int64_t; typedef long int64_t; 我知道这些typedef是在中定义的,基于数据模型类型,然后是平台。是否- ILP32或 LP64或

我正在阅读C-
(u)intN\u t
中的固定大小数据类型

我知道,使用这些数据类型将确保程序员能够确保该数据类型的准确位数

我很好奇这是如何在内部实现的,经过一点研究,我了解到通过头文件,它们的定义如下-

typedef char int8_t;
typedef short int16_t;
typedef long long int64_t;
typedef long int64_t;
我知道这些typedef是在
中定义的,基于
数据模型
类型,然后是平台。是否-

  • ILP32或
  • LP64或
  • ILP64或
  • LL64等
  • 因此,如果平台遵循
    ILP32
    数据模型,那么
    int64_t
    的定义如下-

    typedef char int8_t;
    typedef short int16_t;
    
    typedef long long int64_t;
    
    typedef long int64_t;
    
    如果在这种情况下,平台遵循
    LP64
    数据模型,那么
    int64\t
    的定义如下-

    typedef char int8_t;
    typedef short int16_t;
    
    typedef long long int64_t;
    
    typedef long int64_t;
    
    但我不明白的是,这里的平台是什么

    平台是否指硬件架构类型-x86、x86_64或AMD等

    或者它是指诸如Solaris、AIX、HP-UX、Linux、macOS、BSD或IBMz/OS等操作系统吗

    数据模型是由操作系统还是硬件体系结构决定的

    平台是否指硬件架构类型-x86、x86_64或AMD等

    或者它是指诸如Solaris、AIX、HP-UX、Linux、macOS、BSD或IBMz/OS等操作系统吗

    是的

    例如,ILP32和LP64意味着在前面的整数中,long和指针是32位的;在后者中,long和指针是64位的

    虽然您可以使用64位指针来获得32位内存空间,但这很愚蠢,因为每个指针都会消耗64位,但实际上您只会使用其中的一半。就像你总是只在每张纸的左/上半部分打印一样。但处理器支持是不够的,因为操作系统也必须支持这一点。x86处理器支持多种操作模式,从16位实模式一直到64位长模式——一套硬件,多个平台选项。您可以在64位处理器上运行32位操作系统。您可以在64位处理器上的64位操作系统中运行32位程序


    当我在我的计算机上运行Linux程序时,它们是ILP32和LP64。当我启动到Windows时,那里的程序遵循ILP32和LLP64型号。。。因此,即使在同一套硬件上,我也可以有两个操作系统,其中有两个“平台”可供选择。在Linux领域中,用户地库的选择在C开发中也很重要,因此这两个常见的Linux平台将被称为x86_64-pc-Linux-gnui386 pc-Linux-gnu

    “当我在我的计算机上运行Linux程序时,它们是ILP32和LP64。”-您是说Linux下的程序可以在ILP32或LLP64中运行吗?当你说在一个操作系统内部有两个平台时,你是说操作系统的两个不同实例一个在32位模式下运行,另一个在64位模式下运行?在标准amd64硬件上:32位Windows应用程序:
    ILP32LL64
    ;32位Linux应用程序:
    ILP32LL64
    (相同);64位Windows应用程序:
    IL32LLP64
    ,64位Linux应用程序:
    I32LP64
    不,64位Intel Linux操作系统(可能)能够同时运行32位ILP32和64位LP64程序,因此我可以从中推断出-
    用户程序
    (可执行)是遵循特定
    数据模型
    类型的。编译器是一个执行特定可执行文件(
    用户程序
    )遵循的数据模型的编译器。操作系统(可执行文件)
    也将遵循特定的数据模型。而
    操作系统
    遵循的
    数据模型
    的决定在某种程度上受
    操作系统
    运行的
    硬件架构
    的影响。当我说-
    OS
    必须使用32位变量数据模型,而不能在32位硬件上使用64位变量数据模型。续续-。。。但是,操作系统可以在32位机器上选择是遵循ILP32还是LP32。我的理解正确吗?