对比特场进行类型转换

时间:2016-04-14 17:22:11

标签: c gcc casting

我正在尝试为结构中的位字段赋值。这是降级,因为指定的变量的尺寸小于右侧使用的类型。有没有办法强制进行类型转换,了解降级存在一些风险。这是测试代码,我不认为右手值会比我的位字段更大。

使用编译:

    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;

1 个答案:

答案 0 :(得分: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