在编程之前,如何知道C中不同体系结构中的基元类型的大小
我们学校有两种远程系统;我们可以远程连接到他们并工作。我在其中一个系统上编写了一个C程序,其中void指针的大小和size_t变量的大小为8字节。但当我连接到其他系统时,我的程序开始以不同的方式工作。我为此浪费了太多时间进行调试,最终发现这是由于两个系统之间的架构差异造成的 我的问题是: 基元类型的大小取决于哪些因素 在我们开始编程之前,如何知道基元类型的大小 如何用C编写跨平台代码在编程之前,如何知道C中不同体系结构中的基元类型的大小,c,computer-architecture,C,Computer Architecture,我们学校有两种远程系统;我们可以远程连接到他们并工作。我在其中一个系统上编写了一个C程序,其中void指针的大小和size_t变量的大小为8字节。但当我连接到其他系统时,我的程序开始以不同的方式工作。我为此浪费了太多时间进行调试,最终发现这是由于两个系统之间的架构差异造成的 我的问题是: 基元类型的大小取决于哪些因素 在我们开始编程之前,如何知道基元类型的大小 如何用C编写跨平台代码 在一般情况下,处理器中整数的大小取决于ALU在一个周期中可以操作的位数。 例如 i) 对于8051体系结构,由于
在一般情况下,处理器中整数的大小取决于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编写跨平台代码
#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编写跨平台代码
中的类型。例如,如果需要两字节无符号整数,请使用uint16\u t
结构中的成员是如何对齐的。成员的默认对齐方式可能会从一个系统更改为另一个系统,这意味着成员可能处于不同的字节偏移量,具体取决于编译器。编组数据时,请使用\uuuu属性(打包))
(在GCC上)或类似工具
htons
/ntohs
转换字节顺序
中的类型。例如,如果需要两字节无符号整数,请使用uint16\u t
结构中的成员是如何对齐的。成员的默认对齐方式可能会从一个系统更改为另一个系统,这意味着成员可能处于不同的字节偏移量,具体取决于编译器。编组数据时,请使用\uuuu属性(打包))
(在GCC上)或类似工具