打印
[AVR单片机]

c语言有没有什么数据类型可以保存24位

[复制链接]
1863|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
star21|  楼主 | 2014-6-16 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hdp7891000| | 2014-6-16 21:29 | 只看该作者
struct

使用特权

评论回复
板凳
匿名  2014-6-16 22:08
24位3个字节  不知道你为什么一定要3个字节的   你可以把这3个字节的数据保存在4个字节的数据中,可以只用其低24位就行

使用特权

评论回复
地板
perry_peng| | 2014-6-17 09:50 | 只看该作者
方法很多吧,比如数组或或结构。也可以用一个32bit类型unsigned int.

使用特权

评论回复
5
star21|  楼主 | 2014-6-17 17:53 | 只看该作者
perry_peng 发表于 2014-6-17 09:50
方法很多吧,比如数组或或结构。也可以用一个32bit类型unsigned int.

unsigned int 不是16位的么,我一直都是按16位用的啊,那是int是16位的?uint就是32位?

使用特权

评论回复
6
star21|  楼主 | 2014-6-17 17:54 | 只看该作者
匿名者 发表于 2014-6-16 22:08
24位3个字节  不知道你为什么一定要3个字节的   你可以把这3个字节的数据保存在4个字节的数据中,可以只用 ...

是uint么

使用特权

评论回复
7
star21|  楼主 | 2014-6-17 17:56 | 只看该作者
hdp7891000 发表于 2014-6-16 21:29
struct

我是想要当做形参的,struct可以么,是他的成员加起来有24位么,比如3*8=24;那和数组有区别么

使用特权

评论回复
8
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里的定义就知道。
/** \ingroup avr_stdint
    32-bit signed type. */

typedef signed long int int32_t;

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

typedef unsigned long int uint32_t;

上面是winavr里定义的8bit avr 32位类型。

使用特权

评论回复
9
hdp7891000| | 2014-6-18 08:42 | 只看该作者
star21 发表于 2014-6-17 17:56
我是想要当做形参的,struct可以么,是他的成员加起来有24位么,比如3*8=24;那和数组有区别么 ...

可以当形参。(但是最好传指针)
只从大小讲区别不大

使用特权

评论回复
10
star21|  楼主 | 2014-6-18 20:53 | 只看该作者
perry_peng 发表于 2014-6-18 08:40
用long吧,一般C编译器都支持它是32bit。你看下stdint里的定义就知道。

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

谢了,出来了

使用特权

评论回复
11
john_lee| | 2014-6-21 01:48 | 只看该作者
本帖最后由 john_lee 于 2014-6-21 02:02 编辑

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

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

void foo ()
{
  uint8_t i;
  for (i = 0; i < 10; i++)
    data[i] = i;
}
源码中定义了一个 24bit 的数组,10个元素,理论上应该占用 30 字节。
看看编译生成的汇编:
        .file        "int24.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
        .text
.global        foo
        .type        foo, @function
foo:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
        ldi r30,lo8(data)
        ldi r31,hi8(data)
        ldi r24,0
        ldi r25,0
        ldi r26,0
.L3:
        st Z+,r24
        st Z+,r25
        st Z+,r26
        adiw r24,1
        adc r26,__zero_reg__
        cpi r24,10
        cpc r25,__zero_reg__
        cpc r26,__zero_reg__
        brne .L3
/* epilogue start */
        ret
        .size        foo, .-foo
.global        data
        .section .bss
        .type        data, @object
        .size        data, 30
data:
        .zero        30
        .ident        "GCC: (AVR_8_bit_GNU_Toolchain_3.4.3_1072) 4.8.1"
.global __do_clear_bss
是不是碉堡了?   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

70

帖子

0

粉丝