最近我一直在写东西,我必须使用大量的uint8 / uint16并将它们相互混合并使用整数文字。所以我收到的警告如下:
warning: conversion to 'u16int' from 'int' may alter its value
代码:
u16int attr = attr_byte << 8;
我喜欢编译很多警告。我不喜欢收到警告。是否有一些(最好是干净的)方法来解决这个问题?
答案 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
,因此编译器抱怨从int
到u16int
的转换可能会改变其值。
在这种情况下,左移的结果永远不会大于0xFF00或小于0,因此不会有任何数据丢失。但是如果您不希望编译器在此向您发出警告,则需要将结果转换为u16int
,因为移位的结果将始终为int
或unsigned int
(或一个更大的整数类型),无论其操作数的类型如何。
答案 2 :(得分:2)
u16int attr = ((unsigned int) attr_byte << 8);
您应该只按位移位无符号类型。
C Standard不需要对上述声明进行任何诊断,但如果编译器过于冗长,则可以向按位移位表达式添加额外的uint16_t
强制转换。