1
short
からの暗黙的な変換を防ぐために、int
が16ビット型であると仮定します。式でCで整数昇格を強制する方法
long test_1(short x, short y)
{
return x + y;
}
- この例では数字を促進約Cのルールは何ですか?
- モジュロ演算から保護する方法は?
short
からの暗黙的な変換を防ぐために、int
が16ビット型であると仮定します。式でCで整数昇格を強制する方法
long test_1(short x, short y)
{
return x + y;
}
このルールは比較的簡単です。バイナリ+は "最大" intのデータ型になります。同じ型の2つのオペランドがある場合、結果は同じ型になります。
発現
return x+y
は、二段階で評価されます。最初に、x + yの結果が計算されます。これは短いです(あなたの最初の宣言のように)。関数の型にキャストされます。
あなたがオーバーフローを避けたい場合は、目的のタイプにプラスのオペランドをキャストする必要があります:私は明確にするためoveparenthesizedいる
return ((long)x) + y
。
MSVCでOPの最初のコードを 'test_1(32767,32767);でテストし、正しい結果が' 65534'を返しました。 'short'は少なくとも* 16ビット以上である必要がありますが、私のコンパイラでは*です。 –
@WeatherVane MSVCのABIとは何ですか? – Michas
@Michas AFAIK整数型がintより小さいと、計算前にint型に昇格します。してください[受け入れられた回答を参照してください](http://stackoverflow.com/questions/24371868/why-must-a-short-be-converted-to-an-int-before-arithmetic-operations-in-c-and-c )は、私が短期間で見つけられる最高のものです。 @ WedeVane。 –