4

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

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

代码:

u16int attr = attr_byte << 8;

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

4

3 回答 3

4

你总是可以投:

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

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

于 2012-10-17T19:30:21.637 回答
3

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

整数提升(§6.3.1.1/2)说如果 anint可以代表所有可能的值,那么它被提升为int. 所以,假设它attr_byte是一个字节,它可以容纳一个int,所以它被提升为一个int。因此,左移的结果是 a (signed) int,因此编译器抱怨从intto的转换u16int可能会改变其值是正确的。

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

于 2012-10-17T21:35:11.903 回答
2
u16int attr = ((unsigned int) attr_byte << 8);

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

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

于 2012-10-17T19:35:53.613 回答