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)は、intが可能なすべての値を表すことができる場合、それはに昇格されることを示していintます。したがって、それが1バイトであると仮定するattr_byteと、それはに収まる可能性があるintため、にプロモートされますint。したがって、左シフトの結果は(符号付き)であるため、コンパイラは、からへの変換によってその値が変更される可能性がintあると文句を言うのは正しいことです。intu16int

この場合、左シフトの結果が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 に答える