在网上查找的 32位和64位系统 中,数据类型所占字节数目如下表所示:
数据类型 | 32位 | 64位 |
---|---|---|
char* | 4 | 8 |
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 8 |
long long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
由上图可以得出,32位和64位的数据类型所占字节长度差异主要体现于指针
和long
。
但是,今天编写代码中,发现64位系统的long
长度也为4
,产生疑惑中。。。
- 测试系统:Win10 64位
- 编译器:MinGW 64
可能原因: 难道MinGW 64编译器 对数据类型长度有 优化?
近期看到一篇公众号说的:如果没有特别指定额外编译参数,默认编译都是以32位为准,该种默认规则是为了增加程序在x64/x86系统的兼容性。
/**
* @file test_zeroarray.c
* @author your name (you@domain.com)
* @brief 测试64位 操作系统 各种数据类型 所占字节数
* @version 0.1
* @date 2019-09-25
*
* @copyright Copyright (c) 2019
*
*/
#include <stdio.h>
#include <stdlib.h>
typedef int comm_dev_id_t;
#pragma pack(1) ///< 1字节对齐
/**
* @brief 自定义结构体
*
*/
typedef struct comm_dev_info
{
comm_dev_id_t dev_id; ///< 通信设备id
char* name; ///< 通信设备名称
} comm_dev_info_t;
/**
* @struct自定义结构体
*
*/
typedef struct sys_comm_dev_mannage
{
char buf[2];
comm_dev_info_t comm_dev_info_array;
}sys_comm_dev_mannage_t;
/**
* @brief 主函数
*
* @return int 无意义
*/
int main(void)
{
printf("sizeof(char*) = %d\n", sizeof(char*));
printf("sizeof(char) = %d\n", sizeof(char));
printf("sizeof(short int) = %d\n", sizeof(short int));
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(long) = %d\n", sizeof(long));
printf("sizeof(long long) = %d\n", sizeof(long long));
printf("sizeof(float) = %d\n", sizeof(float));
printf("sizeof(double) = %d\n", sizeof(double));
printf("sizeof(comm_dev_info_t) = %d\n", sizeof(comm_dev_info_t));
printf("sizeof(sys_comm_dev_mannage_t) = %d\n", sizeof(sys_comm_dev_mannage_t));
printf("%x\n", (char*)&((sys_comm_dev_mannage_t *)0)->comm_dev_info_array);
getchar();
}
运行结果: