现在的位置: 首页 > 综合 > 正文

数据长度与嵌入式代码的移植性

2012年01月17日 ⁄ 综合 ⁄ 共 1885字 ⁄ 字号 评论关闭

 

转载请注明出处

作者:小马

 

Iso/ansi本身并不规定内部数据类型的长度(原因简单,如果他们这样做了,现存的大部分代码都不可用了, 所以标准委员会把定义数据类型的任务交给编译器的研发者) 数据类型的长度的是由编译器和CPU共同决定的, 最近调试一个程序,吃了数据长度的亏。数据长度对程序的移植性至关重要。这里对C的基本数据类型长度以及与编译器和CPU的关系做个总结。

 

一 数据长度的陷阱

Char, short,int,long这些数据类型的长度在不同的机器上不同的,不仅是数据长度,不同的编译器对这些数据类型的符号定义也是不同的。比如,在有些编译器,char默认是有符号的,有些编译器把char当成是无符号的。在嵌入式软件中,可移植性异常重要,所以MISRA(汽车工业软件可靠性联合会)就建议使用这些数据类型时,前面一定要有signed或unsigned 修饰,明确说明该数据类型的符号.

用代码举个例子(来自<微软C编程精粹>)

char ch;

ch = 0xff;

if(ch == 0xff)……

学过C的人都应该知道C 的隐式类型转换规则,运算的两个数据类型如果不同,低级的往高级的转换。在本例中,ch 是 char 类型,是低级的,0xff是整型,高级. 在if语句中,ch要转化为整型的。转换的动作就是填充符号位,如果是无符号数就填充0. 所以本例中,如果ch 为无符号数,扩展后ch = 0x00ff(假设整型是16位), if语句成立. 但是如果ch 是有符号的,扩展后 ch = 0xffff, if 语句是不会成立的. 另外要注意逻辑操作符以及左移,右移操作符不支持这种隐式类型转换规则.

 

现在假设我们认为char 是8位(大部分机器上它都是这样的), 那么signed char 的范围应该是-127~127, unsigned char 的范围应该是0~255. ANSI/ISO 是这样写的。写到这里,可能就有人会有疑问了,因为我们可能看到有些书上写有符号的char 的范围是-128~127. 这是说它的补码表示. 其实ANSI/ISO并未规定有符号数用补码表示,所以在如果查一下ANSI/ISO标准会发现它确实有符号的char 是-127~127. 但是现实情况是几乎所有的机器都是用补码来表示有符号数,
正数的补码是它本身,整负数的补码是除符号位外各位取反加1, 最小的负数(signed char)的在计算机里表示为0x80, 把它取补得到它的原码就是-128.

 

二 常用编译器支持的数据类型

C内部的基本数据类型是没有可移植性而言的,不同的机器上,不同的编译器数据长度的大小是不一样的。ISO建议程序员在编写要移植的代码时,不要直接用基本的数据类型,而是用typedef 去重新定义。这样在移植程序的时候只要改动小部分代码就可以了。但是typedef的前提是你对编译环境所支持的数据类型有清楚的认识。去网上找了一下, 还没有一个对目前主流编译器支持的数据类型长度的总结,于是就查了一些资料,这里做一个总结(当然不是全部了,只是列举了我用过的)

 

 

          类型

    编译器

字节

 

  Unsigned/signed char     

visual studio

  1

ads

  1

avr studio(gcc)

  1

Keil c

  1

Turbo c

  1

 --------------------------

 ----------------

 

 

Unsigned/signed short

visual studio

  2

ads

  2

avr studio(gcc)

  2

Keil c

  2

Turbo c

  2

 --------------------------

 ----------------

 

 

Unsigned/signed int

visual studio

  4

ads

  4

avr studio(gcc)

  2

Keil c

  2

Turbo c

  2

 --------------------------

 ----------------

 

 

Unsigned/signed long

visual studio

  8

ads

  4

avr studio(gcc)

  4

Keil c

  4

Turbo c

  4

 --------------------------

 ----------------

 

 

Long long

visual studio

  8

ads

  4

avr studio(gcc)

  8

Keil c

  8

Turbo c

  4

 --------------------------

 ----------------

 

 

double

visual studio

  8

ads

  4

avr studio(gcc)

  4

Keil c

  4

Turbo c

  8

 

抱歉!评论已关闭.