本篇目的:
- 了解c/c++的基本数据类型有哪些
- 测试基本数据类型在各个平台,各个编译器下的sizeof长度
- 了解c/c++交叉编译概念
如果想编写跨平台的c/c++程序,第一个要了解的就是基本数据类型在各操作系统,各个cpu架构下,各个编译器中的字节长度!
1. c/c++中的基本数据类型有哪些:
- [unsigned] char
- [unsigned] short
- [unsigned] int
- [unsigned] long
- [unsigned] long int
- [unsigned] long long
- float
- double
- long double
- wchar_t(c99)
- bool(c++增加的数据类型,c中没有bool类型)
补充说明:c99中<stdbool.h>中定义了bool类型,sizeof(bool) = 1 byte - 指针(应该不是基本类型吧,但是sizeof的结果很重要,也一并放在此处)
2. 测试程序:
#include <stdio.h>
void print_pds_size()
{
printf("sizeof(char) = %d bytes\n", sizeof(char));
printf("sizeof(short) = %d bytes\n", sizeof(short));
printf("sizeof(int) = %d bytes\n", sizeof(int));
printf("sizeof(long) = %d bytes\n", sizeof(long));
printf("sizeof(long int) = %d bytes\n", sizeof(long int));
printf("sizeof(long long) = %d bytes\n", sizeof(long long));
printf("sizeof(float) = %d bytes\n", sizeof(float));
printf("sizeof(double) = %d bytes\n", sizeof(double));
printf("sizeof(long double) = %d bytes\n", sizeof(long double));
printf("sizeof(bool) = %d bytes\n", sizeof(bool));
printf("sizeof(wchar_t) = %d bytes\n", sizeof(wchar_t));
int a = 0;
printf("sizeof(pointer) = %d bytes\n", sizeof(&a));
printf("\n");
}
在各个编译器中运行结果:
- vs2015 32bit:
- vs2015 64bit:
- android ndk(windows版模拟器):
由于android ndk不支持printf输出,而需要使用其log输出,因此修改一下代码,以断点debug方式显示结果。更好的方式应该是抽象一个针对各个平台接口一致的接口函数
两块芯片(arduino nano/esp32):
- 16bit 芯片(arduino tool chain):
- 32bit 芯片(arduino tool chain):
- 树莓派3B(linux arm32)
type | vc32 | vc64 | android | arduino nano | esp32 | 树莓派 | ios |
---|---|---|---|---|---|---|---|
char | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 2 | 4 | 4 | 4 |
long | 4 | 4 | 4 | 4 | 4 | 4 | 8 |
long int | 4 | 4 | 4 | 4 | 4 | 4 | 8 |
long long | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 4 | 8 | 8 | 8 |
long double | 8 | 8 | 8 | 4 | 8 | 8 | 16 |
bool | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
wchar_t | 2 | 2 | 4 | 2 | 2 | 4 | 4 |
指针 | 4 | 8 | 4 | 2 | 4 | 4 | 8 |
结论:
1. 从指针的字节数可以知道当前平台是8/16/32/64位
2. android 模拟机上运行的是32位apk,真机上应该是64位的吧?
3. wchart_t在utf8表示的机器上都是占用4个byte,只有windows才是2byte,至于mcu就略过:本来就1-2k内存,还能指望unicode?
4. 除了指针字节数与32/64位机相关之外,其他数据类型在32/64位字节数基本是一致的,有区别的是编译器。例如ios clang/llvm long是8字节,其他都是4字节
综上所述: 如果想编写跨平台的c/c++代码,你第一步就需要了解数据类型,然后定义各个平台的编译宏,根据编译宏typedef 各种数据类型,从而达到一致性!!!
3. 什么是交叉编译:
简单地说,就是在一个平台上生成另一个平台上的可执行代码
例如: 我在windows上编译出了android(arm)/嵌入式(两块小芯片)的可执行代码。这就是交叉编译。
4.一些说明:
之所以取名闲聊,就是空闲的时候随便聊聊,想到什么就写什么。
内容主要涉及c/c++:
- 跨平台编程
- 跨语言互调
- 常用库编译
计划:每周两篇c/c++方面的闲聊
忍不住吐槽一下,好久没用android了,顺便从as2.2升级到2.3,想不到花了很久时间,占了好多个g的硬盘,好漫长的等待!(晚上更新,时间太长,睡一觉发现终于好了)(