2016-04-14 86 views
0

我试图给结构中的位字段赋值。这是一个降级,因为分配的变量的尺寸小于右侧所用的类型。有没有办法强制转型,理解降级会有一些风险。这是测试代码,我不指望右手的值比我的位字段可以做的更大。类型转换为位字段

编译使用:

gcc -Wconversion compileError.c 

代码:

#include "stdio.h" 

typedef unsigned long int uint64_t; 
typedef unsigned short int uint16_t; 

typedef struct 
{ 
    uint64_t val:48; 
    uint16_t length; 
}data_t; 

static data_t testData[10] = {}; 

int main() 
{ 
    data_t* pData = (data_t*)&testData; 
    uint64_t var = 0; 

    pData->val = var + 1; 

    printf("Just trying to compile this program\n"); 
    return 0; 
} 

编译器输出:

compileError.c: In function main: 
compileError.c:19:22: warning: conversion to long unsigned 
int:48 from uint64_t may alter its value [-Wconversion] 
pData->val = var + 1; 
+0

当你尝试'typedef unsigned long long uint64_t;''时会发生什么? –

+0

与以前相同的输出。 sizeof(uint64_t)为我的测试代码返回8。 –

+0

那么,直到我从'无符号长'MSVC报告'的错误C2034:'val':比特字段的类型太小的位数“更改。更改后,一个干净的编译(除了空的'{}'初始化程序)。 –

回答

0

blog显示了如何将暂时关闭该警告。

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wconversion" 
    pData->val = var + 1; 
#pragma GCC diagnostic pop 

有一个开放的GCC改进请求解决这个问题,并有一个comment显示使用屏蔽解决方法。

pData-> val = (var + 1) & 0xffffffffffffLU