所以最近我一直在写一些东西,我必须使用很多 uint8/uint16 并将它们相互混合以及整数文字。所以我收到警告,例如:
warning: conversion to 'u16int' from 'int' may alter its value
代码:
u16int attr = attr_byte << 8;
我喜欢编译时有很多警告。我不喜欢收到警告。有一些(最好是干净的)方法来解决这个问题吗?
所以最近我一直在写一些东西,我必须使用很多 uint8/uint16 并将它们相互混合以及整数文字。所以我收到警告,例如:
warning: conversion to 'u16int' from 'int' may alter its value
代码:
u16int attr = attr_byte << 8;
我喜欢编译时有很多警告。我不喜欢收到警告。有一些(最好是干净的)方法来解决这个问题吗?
你总是可以投:
u16int attr = (u16int)(attr_byte << 8);
即你告诉编译器你知道你在做什么。
C 标准规定对每个操作数执行“整数提升”,结果的类型是提升的左操作数的类型(C99 §6.5.7/3)。
整数提升(§6.3.1.1/2)说如果 anint
可以代表所有可能的值,那么它被提升为int
. 所以,假设它attr_byte
是一个字节,它可以容纳一个int
,所以它被提升为一个int
。因此,左移的结果是 a (signed) int
,因此编译器抱怨从int
to的转换u16int
可能会改变其值是正确的。
在这种情况下,左移的结果永远不会大于 0xFF00 或小于 0,因此不会有任何数据丢失。但是,如果您不希望编译器在此处警告您,则需要将结果转换为u16int
,因为无论其操作数的类型如何,移位的结果将始终是int
or unsigned int
(或更大的整数类型)。
u16int attr = ((unsigned int) attr_byte << 8);
您应该只按位移动无符号类型。
C 标准不需要对上述声明进行任何诊断,但如果您的编译器过于冗长,您可以uint16_t
向按位移位表达式添加额外的强制转换。