[AVR单片机] c语言有没有什么数据类型可以保存24位

[复制链接]
2325|10
 楼主| star21 发表于 2014-6-16 20:11 | 显示全部楼层 |阅读模式
在ICC AVR 的编译器里面
hdp7891000 发表于 2014-6-16 21:29 | 显示全部楼层
匿名  发表于 2014-6-16 22:08
24位3个字节  不知道你为什么一定要3个字节的   你可以把这3个字节的数据保存在4个字节的数据中,可以只用其低24位就行
perry_peng 发表于 2014-6-17 09:50 | 显示全部楼层
方法很多吧,比如数组或或结构。也可以用一个32bit类型unsigned int.
 楼主| star21 发表于 2014-6-17 17:53 | 显示全部楼层
perry_peng 发表于 2014-6-17 09:50
方法很多吧,比如数组或或结构。也可以用一个32bit类型unsigned int.

unsigned int 不是16位的么,我一直都是按16位用的啊,那是int是16位的?uint就是32位?
 楼主| star21 发表于 2014-6-17 17:54 | 显示全部楼层
匿名者 发表于 2014-6-16 22:08
24位3个字节  不知道你为什么一定要3个字节的   你可以把这3个字节的数据保存在4个字节的数据中,可以只用 ...

是uint么
 楼主| star21 发表于 2014-6-17 17:56 | 显示全部楼层
hdp7891000 发表于 2014-6-16 21:29
struct

我是想要当做形参的,struct可以么,是他的成员加起来有24位么,比如3*8=24;那和数组有区别么
perry_peng 发表于 2014-6-18 08:40 | 显示全部楼层
star21 发表于 2014-6-17 17:53
unsigned int 不是16位的么,我一直都是按16位用的啊,那是int是16位的?uint就是32位? ...

用long吧,一般C编译器都支持它是32bit。你看下stdint里的定义就知道。
  1. /** \ingroup avr_stdint
  2.     32-bit signed type. */

  3. typedef signed long int int32_t;

  4. /** \ingroup avr_stdint
  5.     32-bit unsigned type. */

  6. typedef unsigned long int uint32_t;

上面是winavr里定义的8bit avr 32位类型。
hdp7891000 发表于 2014-6-18 08:42 | 显示全部楼层
star21 发表于 2014-6-17 17:56
我是想要当做形参的,struct可以么,是他的成员加起来有24位么,比如3*8=24;那和数组有区别么 ...

可以当形参。(但是最好传指针)
只从大小讲区别不大
 楼主| star21 发表于 2014-6-18 20:53 | 显示全部楼层
perry_peng 发表于 2014-6-18 08:40
用long吧,一般C编译器都支持它是32bit。你看下stdint里的定义就知道。

上面是winavr里定义的8bit avr 3 ...

谢了,出来了
john_lee 发表于 2014-6-21 01:48 | 显示全部楼层
本帖最后由 john_lee 于 2014-6-21 02:02 编辑

这种事情,只有无所不能的 gcc 表示没有压力,测试一下:
源码:
  1. #include <avr/io.h>

  2. __int24 data[10];  // 24bit (3字节) 数组

  3. void foo ()
  4. {
  5.   uint8_t i;
  6.   for (i = 0; i < 10; i++)
  7.     data[i] = i;
  8. }
源码中定义了一个 24bit 的数组,10个元素,理论上应该占用 30 字节。
看看编译生成的汇编:
  1.         .file        "int24.c"
  2. __SP_H__ = 0x3e
  3. __SP_L__ = 0x3d
  4. __SREG__ = 0x3f
  5. __tmp_reg__ = 0
  6. __zero_reg__ = 1
  7.         .text
  8. .global        foo
  9.         .type        foo, @function
  10. foo:
  11. /* prologue: function */
  12. /* frame size = 0 */
  13. /* stack size = 0 */
  14. .L__stack_usage = 0
  15.         ldi r30,lo8(data)
  16.         ldi r31,hi8(data)
  17.         ldi r24,0
  18.         ldi r25,0
  19.         ldi r26,0
  20. .L3:
  21.         st Z+,r24
  22.         st Z+,r25
  23.         st Z+,r26
  24.         adiw r24,1
  25.         adc r26,__zero_reg__
  26.         cpi r24,10
  27.         cpc r25,__zero_reg__
  28.         cpc r26,__zero_reg__
  29.         brne .L3
  30. /* epilogue start */
  31.         ret
  32.         .size        foo, .-foo
  33. .global        data
  34.         .section .bss
  35.         .type        data, @object
  36.         .size        data, 30
  37. data:
  38.         .zero        30
  39.         .ident        "GCC: (AVR_8_bit_GNU_Toolchain_3.4.3_1072) 4.8.1"
  40. .global __do_clear_bss
是不是碉堡了?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部