2016-04-14 66 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