int类型的变量据称是“一个机器类型的单词” 但是在嵌入式系统中,用于8位微处理的C编译器具有16位的int!(对于无符号字符为8位)然后对于更多位,int表现正常: 在16位微型int中也是16位,在32位微型int中是32位等。
那么,有没有一种标准的测试方法,比如BITSIZEOF(int)?
像“sizeof”这样的字节用于字节但用于位。这是我的第一个想法
register c=1;
int bitwidth=0;
do
{
bitwidth++;
}while(c<<=1);
printf("Register bit width is : %d",bitwidth);
但它需要c作为int,并且在8位编译器中使用int作为16位是常见的,因此它给出了16作为结果,似乎没有标准使用“int”作为“寄存器宽度”,(或者它没有得到尊重)
为什么我要检测它?假设我需要许多需要少于256个值的变量,因此它们可以是8,16,32位,但使用正确的大小(与内存和寄存器相同)将加速并节省内存,如果这不是在代码中决定,我必须为每个架构重新编写函数
修改 看完答案后,我找到了这篇好文章
http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/
我将引用结论(加粗)
因此 底线是这个。如果你想 开始写高效,便携 嵌入式代码,第一步你 应该采取的是开始使用C99 数据类型'最少'和'快'。如果你的 编译器不符合C99 抱怨直到 - 或改变 供应商。如果你做了这个改变我 认为你会惊喜 在代码大小的改进和 你将达到的速度。
答案 0 :(得分:17)
我必须为每个架构重新编写函数
不,不。使用C99的stdint.h
,其类型为uint_fast8_t
,这将是一种能够快速保存256个值的类型。
然后,无论平台如何,类型都会相应更改,并且您不会更改代码中的任何内容。如果您的平台没有这些定义的集合,您可以添加自己的平台。
远比重写每个功能好。
答案 1 :(得分:7)
#include <limits.h>
const int bitwidth = sizeof(int) * CHAR_BIT;
答案 2 :(得分:7)
要更直接地回答您的更深层次的问题,如果您需要跨平台可移植的非常具体的存储空间,则应使用 types.h
stdint.h
之类的内容。定义用位数指定的存储类型。
例如,uint32_t
始终是无符号32位,int8_t
始终是8位符号。
答案 3 :(得分:1)
编译时编译的ISA在代码运行时已经为编译器所知,所以最好的办法是在编译时检测它。根据您的环境,您可以使用从autoconf / automake样式内容到较低级别#ifdef的所有内容来将代码调整为它将运行的特定体系结构。
答案 4 :(得分:1)
我并不完全理解你的意思是“没有标准使用”int“as”寄存器宽度“。在原始的C语言规范(C89 / 90)中,类型int
隐含在当没有提供显式类型时,某些上下文。register c
等同于register int c
,这在C89 / 90中是完全标准的。另请注意,C语言规范要求类型int
至少支持-32767 ... + 32767范围,意味着在任何平台int
上将至少有16个值形成位。
对于位宽... sizeof(int) * CHAR_BIT
将为您提供类型为int
的对象表示中的位数。
但从理论上讲,类型int
的值表示不能保证使用其对象表示的所有位。如果您需要确定用于值表示的位数,则可以简单地分析INT_MIN
和INT_MAX
值。
P.S。看看你问题的标题,我怀疑你真正需要的只是CHAR_BIT
值。
答案 5 :(得分:0)
unsigned char
或unsigned short
是否符合您的需求?为什么不使用它?如果没有,您应该使用编译时标志来引入适当的代码。
答案 6 :(得分:0)
我认为在这种情况下,您不需要知道您的架构有多少位。如果要优化代码,只需使用尽可能小的变量即可。