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

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

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

码:

 u16int attr = attr_byte << 8; 

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

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

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

在这种情况下,左移的结果永远不会大于0xFF00或小于0,因此不会有任何数据丢失。 但是如果你不希望编译器在这里警告你,你需要将结果转换为u16int ,因为shift的结果总是intunsigned int (或更大的整数类型),无论类型如何它的操作数。

你总是可以施放:

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

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

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

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

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