Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编程之前,如何知道C中不同体系结构中的基元类型的大小_C_Computer Architecture - Fatal编程技术网

在编程之前,如何知道C中不同体系结构中的基元类型的大小

在编程之前,如何知道C中不同体系结构中的基元类型的大小,c,computer-architecture,C,Computer Architecture,我们学校有两种远程系统;我们可以远程连接到他们并工作。我在其中一个系统上编写了一个C程序,其中void指针的大小和size_t变量的大小为8字节。但当我连接到其他系统时,我的程序开始以不同的方式工作。我为此浪费了太多时间进行调试,最终发现这是由于两个系统之间的架构差异造成的 我的问题是: 基元类型的大小取决于哪些因素 在我们开始编程之前,如何知道基元类型的大小 如何用C编写跨平台代码 在一般情况下,处理器中整数的大小取决于ALU在一个周期中可以操作的位数。 例如 i) 对于8051体系结构,由于

我们学校有两种远程系统;我们可以远程连接到他们并工作。我在其中一个系统上编写了一个C程序,其中void指针的大小和size_t变量的大小为8字节。但当我连接到其他系统时,我的程序开始以不同的方式工作。我为此浪费了太多时间进行调试,最终发现这是由于两个系统之间的架构差异造成的

我的问题是:

基元类型的大小取决于哪些因素

在我们开始编程之前,如何知道基元类型的大小

如何用C编写跨平台代码


在一般情况下,处理器中整数的大小取决于ALU在一个周期中可以操作的位数。 例如

i) 对于8051体系结构,由于数据总线的大小为8位,所有8051编译器都指定整数的大小为8位

ii)对于32位ARM体系结构,数据总线为8位宽,整数的大小为32位

您应该始终参考编译器文档以了解数据类型的正确大小

几乎所有编译器都将其名称/版本声明为预定义宏,您可以在头文件中使用它们,如下所示:

#ifedef COMPILER_1

typedef char   S8
typedef int    S16
typedef long   S32
      :
      :

#else COPILER_2

typedef int    S32
typedef long   S64
      :
      :
#endif
然后在代码中可以声明变量,如

S32 Var1;

在一般情况下,处理器中整数的大小取决于ALU在一个周期中可以操作的位数。 例如

i) 对于8051体系结构,由于数据总线的大小为8位,所有8051编译器都指定整数的大小为8位

ii)对于32位ARM体系结构,数据总线为8位宽,整数的大小为32位

您应该始终参考编译器文档以了解数据类型的正确大小

几乎所有编译器都将其名称/版本声明为预定义宏,您可以在头文件中使用它们,如下所示:

#ifedef COMPILER_1

typedef char   S8
typedef int    S16
typedef long   S32
      :
      :

#else COPILER_2

typedef int    S32
typedef long   S64
      :
      :
#endif
然后在代码中可以声明变量,如

S32 Var1;
问题:

基元类型的大小取决于哪些因素

CPU和编译器

问题:

在我们开始编程之前,如何知道基元类型的大小

你不能。但是,您可以编写一个小程序来获取基本类型的大小

    #include <stdio.h>

    int main()
    {
       printf("Size of short: %zu\n", sizeof(short));
       printf("Size of int: %zu\n", sizeof(int));
       printf("Size of long: %zu\n", sizeof(long));
       printf("Size of long long: %zu\n", sizeof(long long));
       printf("Size of size_t: %zu\n", sizeof(size_t));
       printf("Size of void*: %zu\n", sizeof(void*));
       printf("Size of float: %zu\n", sizeof(float));
       printf("Size of double: %zu\n", sizeof(double));
    }
#包括
int main()
{
printf(“短的大小:%zu\n”,sizeof(短));
printf(“int的大小:%zu\n”,sizeof(int));
printf(“长的大小:%zu\n”,sizeof(长));
printf(“long-long的大小:%zu\n”,sizeof(long-long));
printf(“大小的大小:%zu\n”,大小(大小));
printf(“空隙大小*:%zu\n”,空隙大小*);
printf(“浮点大小:%zu\n”,sizeof(浮点));
printf(“双精度的大小:%zu\n”,sizeof(双精度));
}
问题:

如何用C编写跨平台代码

  • 最小化依赖于基元类型大小的代码
  • 在平台之间交换数据时,尽可能使用文本文件保存持久数据
  • 问题:

    基元类型的大小取决于哪些因素

    CPU和编译器

    问题:

    在我们开始编程之前,如何知道基元类型的大小

    你不能。但是,您可以编写一个小程序来获取基本类型的大小

        #include <stdio.h>
    
        int main()
        {
           printf("Size of short: %zu\n", sizeof(short));
           printf("Size of int: %zu\n", sizeof(int));
           printf("Size of long: %zu\n", sizeof(long));
           printf("Size of long long: %zu\n", sizeof(long long));
           printf("Size of size_t: %zu\n", sizeof(size_t));
           printf("Size of void*: %zu\n", sizeof(void*));
           printf("Size of float: %zu\n", sizeof(float));
           printf("Size of double: %zu\n", sizeof(double));
        }
    
    #包括
    int main()
    {
    printf(“短的大小:%zu\n”,sizeof(短));
    printf(“int的大小:%zu\n”,sizeof(int));
    printf(“长的大小:%zu\n”,sizeof(长));
    printf(“long-long的大小:%zu\n”,sizeof(long-long));
    printf(“大小的大小:%zu\n”,大小(大小));
    printf(“空隙大小*:%zu\n”,空隙大小*);
    printf(“浮点大小:%zu\n”,sizeof(浮点));
    printf(“双精度的大小:%zu\n”,sizeof(双精度));
    }
    
    问题:

    如何用C编写跨平台代码

  • 最小化依赖于基元类型大小的代码
  • 在平台之间交换数据时,尽可能使用文本文件保存持久数据
  • 如何用C编写跨平台代码

    如果您需要以独立于平台的方式(例如在文件系统上或通过网络)封送数据,您应该(至少)在以下方面保持一致:

  • 数据类型大小-依赖于
    中的类型。例如,如果需要两字节无符号整数,请使用
    uint16\u t

  • 数据类型对齐/填充-注意
    结构中的成员是如何对齐的。成员的默认对齐方式可能会从一个系统更改为另一个系统,这意味着成员可能处于不同的字节偏移量,具体取决于编译器。编组数据时,请使用
    \uuuu属性(打包))
    (在GCC上)或类似工具

  • 字节顺序多字节整数可以按任意顺序与其字节一起存储:小端系统将最低有效字节存储在最低地址/偏移量,而大端系统则以最高有效字节开始。幸运的是,每个人都同意通过网络以big-endian的形式发送字节。为此,在通过网络连接发送/接收多字节整数时,我们使用
    htons
    /
    ntohs
    转换字节顺序

  • 如何用C编写跨平台代码

    如果您需要以独立于平台的方式(例如在文件系统上或通过网络)封送数据,您应该(至少)在以下方面保持一致:

  • 数据类型大小-依赖于
    中的类型。例如,如果需要两字节无符号整数,请使用
    uint16\u t

  • 数据类型对齐/填充-注意
    结构中的成员是如何对齐的。成员的默认对齐方式可能会从一个系统更改为另一个系统,这意味着成员可能处于不同的字节偏移量,具体取决于编译器。编组数据时,请使用
    \uuuu属性(打包))
    (在GCC上)或类似工具

  • B