struct为208位长变量

时间:2015-01-19 20:05:32

标签: c struct bit-manipulation

我正在尝试创建一个struct,它可以容纳208个字节位。我的意图是使用每3位变量来存储68个值,每个值介于0和4之间。

我目前有这个,但我遇到了很多错误:

typedef struct {
    uint64_t _1vr = 0;
    uint64_t _2vr = 0;
    uint64_t _3vr = 0;
    uint16_t _4vr = 0;
} TEST;

const TEST test_bits = {
    ._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
    (BVUS_VISOKO << 60),
    ._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
    (BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
    (BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
    (BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
    (BVUS_NIZKO1 << 60),
    ._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
    (BVUS_VISOKO << 60),
    ._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) |     (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};
  • 4x:警告19('test_bits'接近初始化)[默认启用]
  • 4x:警告4初始化程序中的多余元素[默认启用]
  • 错误1预期':',',',';','}'或'__ attribute__'在'='标记之前
  • 整串:警告51左移计数&gt; =类型宽度[默认启用]
  • 错误2初始化程序中指定的未知字段'_1vr'
  • 错误20初始化程序中指定的未知字段'_2vr'
  • 错误38初始化程序中指定的未知字段'_3vr'
  • 错误56初始化程序中指定的未知字段'_4vr'

这些变量在全球范围内定义。

我不知道最近发生了什么。说实话,我没有看到任何错误(当然我错了,但......)

修改

完全按照WChargin的说法,我仍然无法摆脱下一个错误:

  • 错误12('test_bits._1vr'附近初始化')
  • 错误24(接近初始化'test_bits._2vr')
  • 错误36('test_bits._3vr'初始化附近)
  • 错误11初始化元素不是常量
  • 警告1左移班次&gt; =类型宽度[默认启用]

EDIT2:

我在8位架构上这样做。

2 个答案:

答案 0 :(得分:1)

问题:

  • 您无法在struct声明中初始化struct成员。 也就是说,您的uint64_t _1vr = 0;语句无效。 这就是为什么你得到“期望......之前'='令牌”错误。
  • 据推测,你的常数被定义为错误的大小 - 它们不是long吗? 为简单起见,我刚刚在这里使用了#define,这很有效。

这个编译很好(gcc -c):

#include <stdint.h>

typedef struct {
    uint64_t _1vr;
    uint64_t _2vr;
    uint64_t _3vr;
    uint16_t _4vr;
} TEST;

#define BVUS_ZAC1    0ul
#define BVUS_ZAC2    0ul
#define BVUS_VISOKO  0ul
#define BVUS_NIZKO1  0ul
#define BVUS_NIZKO2  0ul

const TEST test_bits = {
    ._1vr = (BVUS_ZAC1 << 0) | (BVUS_ZAC2 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO2 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO1 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO1 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO1 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO1 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO1 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO1 << 57) |
    (BVUS_VISOKO << 60),
    ._2vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) | (BVUS_VISOKO << 9) | (BVUS_NIZKO2 << 12) |
    (BVUS_VISOKO << 15) | (BVUS_NIZKO2 << 18) | (BVUS_VISOKO << 21) | (BVUS_NIZKO2 << 24) | (BVUS_VISOKO << 27) |
    (BVUS_NIZKO2 << 30) | (BVUS_VISOKO << 33) | (BVUS_NIZKO2 << 36) | (BVUS_VISOKO << 39) | (BVUS_NIZKO1 << 42) |
    (BVUS_VISOKO << 45) | (BVUS_NIZKO1 << 48) | (BVUS_VISOKO << 51) | (BVUS_NIZKO1 << 54) | (BVUS_VISOKO << 57) |
    (BVUS_NIZKO1 << 60),
    ._3vr = (BVUS_VISOKO << 0) | (BVUS_NIZKO1 << 3) | (BVUS_VISOKO << 6) | (BVUS_NIZKO1 << 9) | (BVUS_VISOKO << 12) |
    (BVUS_NIZKO1 << 15) | (BVUS_VISOKO << 18) | (BVUS_NIZKO1 << 21) | (BVUS_VISOKO << 24) | (BVUS_NIZKO2 << 27) |
    (BVUS_VISOKO << 30) | (BVUS_NIZKO2 << 33) | (BVUS_VISOKO << 36) | (BVUS_NIZKO2 << 39) | (BVUS_VISOKO << 42) |
    (BVUS_NIZKO2 << 45) | (BVUS_VISOKO << 48) | (BVUS_NIZKO2 << 51) | (BVUS_VISOKO << 54) | (BVUS_NIZKO2 << 57) |
    (BVUS_VISOKO << 60),
    ._4vr = (BVUS_NIZKO2 << 0) | (BVUS_VISOKO << 3) | (BVUS_NIZKO2 << 6) |     (BVUS_VISOKO << 9) | (BVUS_NIZKO1 << 12)
};

但请注意,sizeof(TEST)在我的(64位)计算机上产生32。 这可能不是你想要的。

答案 1 :(得分:0)

在这个特定的体系结构中,64位被定义为long long,因此更改发布到ULL的定义@WChargin工作。