警告:从'int'转换为'u8int'可能会改变其值等

时间:2012-10-17 19:27:26

标签: c

最近我一直在写东西,我必须使用大量的uint8 / uint16并将它们相互混合并使用整数文字。所以我收到的警告如下:

warning: conversion to 'u16int' from 'int' may alter its value

代码:

u16int attr = attr_byte << 8;

我喜欢编译很多警告。我不喜欢收到警告。是否有一些(最好是干净的)方法来解决这个问题?

3 个答案:

答案 0 :(得分:4)

你总是可以施放:

u16int attr = (u16int)(attr_byte << 8);

即。你告诉编译器你知道你在做什么。

答案 1 :(得分:3)

C标准表示对每个操作数执行“整数提升”,结果的类型是提升左操作数的类型(C99§6.5.7/ 3)。

整数提升(§6.3.1.1/ 2)表示,如果int可以表示所有可能的值,则会将其提升为int。因此,假设attr_byte是一个字节,它可以适合int,因此它被提升为int。因此,左移的结果是(带符号)int,因此编译器抱怨从intu16int的转换可能会改变其值。

在这种情况下,左移的结果永远不会大于0xFF00或小于0,因此不会有任何数据丢失。但是如果您不希望编译器在此向您发出警告,则需要将结果转换为u16int,因为移位的结果将始终为intunsigned int(或一个更大的整数类型),无论其操作数的类型如何。

答案 2 :(得分:2)

u16int attr = ((unsigned int) attr_byte << 8);

您应该只按位移位无符号类型。

C Standard不需要对上述声明进行任何诊断,但如果编译器过于冗长,则可以向按位移位表达式添加额外的uint16_t强制转换。