2017-04-03 15 views
1

私は2つの整数を持っています。整数:-32768,16992浮動小数点に変換する整数値

これらの2つの値は、基本的に、modbusの保持レジスタの整数値です。この整数を浮動小数点数に変換したい上位/下位の値が負の値になると、マイコンのコンバータのロジックが例外以下になりますが、Modbusのポーリングはその値をと表示します35.12

エラー:UInt16では値が大きすぎるか小さすぎます。

void Main() 
{ 
    GetSingle(16992,-32768); 
} 
public static float GetSingle(ushort highOrderValue, ushort lowOrderValue) 
{ 
    return BitConverter.ToSingle(BitConverter.GetBytes(lowOrderValue).Concat(BitConverter.GetBytes(highOrderValue)).ToArray(), 0); 
} 
+6

ushortは "unsigned short"の状態であるため、定義では負であってはいけません。 – Evk

+0

ただし、Longデータ型では機能しません。私がushortではなくlongを使用する場合。値はNaNを示します。 – Lawrence1987

+0

ロングは8バイトなので、2つのロングは16バイトですが、浮動はわずか4バイトです。あなたは何をしようとしているのかを明らかにする必要があります。つまり、その2つの数字をどうやって得たのですか?そして正確に表現しているものは何ですか(この質問を読んでいる人の99%はmodbusが何であるか分かりません)。あなたの前提「私は2つの整数を持っています。整数:-32768,16992」はすでに間違っています。 – Evk

答えて

0

IntegerOverlowを投げるが、静かに2の補数の値を使用しないでください)あなたは文脈でuncheckedを探しているようだ:

void Main() 
{ 
    // unchecked(...) <- do not throw exception 
    GetSingle(16992, unchecked((ushort)-32768)); 
} 

それとも

void Main() 
{ 
    unchecked 
    { 
     GetSingle(16992, -32768); 
    } 
} 

GetSingleの結果方法は

56.125 
です
+0

ありがとう!チェックされていない方法が私のために働く。これをVB.Netでチェックしないで書く方法の助けが必要ですか?ありがとう、助けをありがとう – Lawrence1987

+0

@ Lawrence1987:私が見ることができる限り、 'VB.Net'の場合は、' checked'' unchecked'キーワードはありません。ソリューションエクスプローラ - >プロパティ - >ビルド - >高度な(ボタン) - >算術オーバーフロー/アンダーフローのチェック –

+0

ハイドミトリー: '' linqpad C#私はC#アプリケーションでこのロジックを実装したときに動作しません。 VB.netについて言及したように設定した設定はありますか? – Lawrence1987

関連する問題