如何确保数据类型与C++中需要的数据类型一样大
How to make sure a data type is as large as it needs to be in C++
有没有一种简单的方法可以确保C/C++中不同平台和体系结构的数据类型保持相同的大小?
在C++中,假设我已经编写了一个假设的、基本的程序:
#include <iostream>
int foo;
int main(void)
{
std::cout<<"Size of foo is "<<sizeof(foo)<<" bytes."<<std::endl;
return 0;
}
这个程序所做的只是打印任意整数数据类型的大小并退出。在我的机器上,它将foo
的大小返回为4个字节(我有一台64位机器)。
但是,假设我为Arduino或其他ATMega供电板编写了这个程序:
int foo;
void setup()
{
Serial.begin(9600);
Serial.print("Size of foo is ");
Serial.print(sizeof(foo));
Serial.println(" bytes.");
}
void loop(){}
在我的Arduino UNO板上,它只返回2(与我机器上的short
大小相同)。
是否可以制作一个(最好是跨平台)标头或声明,以确保数据类型的大小是一定的大小,从而避免遇到精度问题或非常大的数字问题?
理想情况下,这不仅适用于Arduino板,还适用于其他紧凑型MCU(如PicKit)。
我对Arduino和整个Arduino IDE都比较陌生,所以如果我错过了一些超级简单的东西,请原谅我。
一个相当现代的C++实现应该具有头<cstdint>
,它提供intN_t
和uintN_t
,其中N
是8、16、32和64。使用这些定义良好的类型可以保证代码按照您的意愿进行编译和行为,或者不进行编译,这样您就不会遇到"我的代码没有实现我对32位整数的期望"的问题。为了实现超级便携性,您可以使用`int_
在一个没有<cstdint>
的系统中,你可以使用一些合适的typedef
来实现同样的事情,例如基于什么编译器(例如#if defined(__GCC__) && define(__i386__) ...
或一些制作文件的技巧,对各种预期类型的大小进行采样,然后生成正确的typedef
行。
是。使用<cstdint>
中定义的固定宽度整数类型,通常为以下类型之一:
int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t
对于不同的用例,还有其他一些。它们从C++11开始提供。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何使映射键具有两种不同的数据类型?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在C 中,对Pair类STL的用途是什么,就像数据类型或容器一样
- 如何确保数据类型与C++中需要的数据类型一样大