【发布时间】:2019-06-27 09:25:09
【问题描述】:
我正在使用 atmega2560 控制器和 avr-g++。我正在调试适用于我的 Ubuntu 18.04 主机(使用 g++ 编译时)但不适用于 atmega2560 的代码。我以为可能是数据类型大小不同的问题,用this代码调查了一下(下面也给出了):
int integerType;
float floatType;
double doubleType;
char charType;
printf("Size of int: %ld bytes\n",sizeof(integerType));
printf("Size of float: %ld bytes\n",sizeof(floatType));
printf("Size of double: %ld bytes\n",sizeof(doubleType));
printf("Size of char: %ld byte\n",sizeof(charType));
主机上的结果看起来不错,但 atmega2560 上的 avr-g++ 编译代码为不同的数据类型提供了狂野的大小:
g++:
Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of char: 1 byte
avr-g++:
Size of int: 2 bytes
Size of float: 41680900 bytes
Size of double: 43253764 bytes
Size of char: 44957697 byte
这完全不现实。这可能是什么原因?
更新
建议我尝试使用 %zu 而不是 %ld 来打印来自 sizeof(...) 的 std::size_t 输出。不幸的是,这不起作用,输出如下所示:
Size of int: Size of float: Size of double: Size of char:
【问题讨论】:
-
根据this的回答,正确的说明符是
%zu。也许这就是问题所在。 -
如果对返回类型有疑问,可以试试
std::cout << sizeof(.) << "\n" -
l在该格式表达式中没有位置。我似乎已经提到了这一点。sizeof也是一个运算符,而不是一个函数:它不需要括号。 -
似乎
sizeof()在 avr-g++ 上返回unsigned ints,而不是unsigned longs。因此,如果您删除l,您将看到正确的结果。 -
好吧,你总是可以使用丑陋的演员表:
printf("Size of float: %d bytes\n", (int)sizeof(float));,但你为什么不使用std::cout?
标签: c++ floating-point avr sizeof atmega