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

さて、私は 'unsigned long'から変更するまで、MSVCは「エラーC2034: 'val':ビット数が小さすぎるビットタイプ」と報告しました。変更後、クリーンなコンパイル(空の '{}'イニシャライザとは別に)。 –

答えて

0

このblogはあなたが一時的にその警告を沈黙する方法を示しを使用してコンパイル

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

この問題に対処するためのオープンGCCの拡張要求があります、とマスキングを使用して回避策を示すcommentがあります。

関連する問題