• ベストアンサー

C#で型変換がうまくいきません。

C#で型変換がうまくいきません。 short r; byte[] b = new byte[] {1,2,3}; r = (short)b[1] * (short)256; というコードを書くと、 型 'int' を 'short' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) と出てしまいます。キャストしているのに何がいけないのか全くわかりません。 どうぞ宜しくお願いいたします。

noname#230227
noname#230227

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

んー、エラー内容からしてみると、こうしたらどうなります? r = (short)(b[1] * 256); 要は右辺がintになってて左辺代入時に暗黙キャストと解釈されてるかもってことですが。

noname#230227
質問者

補足

回答ありがとうございます。 試したところ、エラーがなくなりました。 ありがとうございます。 ところで、最初のと教えていただいたのは、何が違うのでしょうか? #色々調べたら、BitConverter.ToInt16()がやりたい処理そのままだと分かり、そちらを使うことにしました。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> 最初のと教えていただいたのは、何が違うのでしょうか? 演算前にキャストしているか、演算後に(演算結果を)キャストしているかの違いです。

noname#230227
質問者

お礼

なるほど、ありがとうございました。

関連するQ&A

  • Java intの扱い

    こんにちは、Javaを勉強しているものです。 小さなデータ(byteなど)をより大きないれもの(intなど)に入れるときには、暗黙的なキャストがおこなわれます。 逆に、大きな値を小さないれものに入れるための変換を「縮小変換」と呼び、これには明示的なキャストが必要だと習いました。 そこで、次のようなコードがあった場合、これは明示的なキャストが必要なのではないのでしょうか? byte b = 3; これは、コンパイルエラーにはならないのですが、 3はint型であり、bはbyte型なので、大きな値を小さな小さないれものに入れているということになります。本来であれば byte b = (byte)3; と書くべきではないのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 16進数のマスク処理

    C#勉強中です。 以下のようなコードを書いてコンパイルをかけたところ、「型 'uint' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 」と出ました。この理由がわかりません。 0xFFFF00FFはなぜ符合なしとなってunsigned扱いになるのでしょうか。 [Code] int ret = 0; ret &= 0xFFFF00FF;

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • C言語の型変換について

    short int 型をunsigned char型に変換する方法をおしえてください

  • 暗黙の型変換をやめたい

    ASP.NET(C#2.0)からSQLServer2008R2のストアドプロシージャをコールする際、暗黙の型変換を使うとパフォーマンスが落ちるらしいので、全て明示的な型変換に修正したいと思っています。 MySQLをselectした値をリーダー(reader)に格納し、SQLServerにストアドコール時にパラメータ指定してinsertするのですが、何が暗黙的で何が明示的なのかわかりません。 下記は引数1にパラメータ、引数2にDBType(省略可)、引数3に値を指定しています。 [暗黙的かと思われるパラメータの渡し方] AddParameter("@パラメータ1", reader["値1"]); //char(2) AddParameter("@パラメータ2", DbType.string, reader["値2"].ToString()); //nvarchar(20) [明示的かと思われるパラメータの渡し方] AddParameter("@パラメータ3", DbType.DateTime, Convert.ToDateTime(reader["値3"])); //datetime AddParameter("@パラメータ4", DbType.Currency, (Convert.ToDecimal(reader["値4"])) * 100); //money 暗黙の型変換とは、引数3の型を指定しない場合に起こるという認識で合っていますでしょうか?

  • C#で実行時にメソッドの返り値の型を変化させる

    C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか? たとえば、 public class MyData { object o; public void setValue( object a ) { o = a; } public object getValue() { return o; } } というクラスがあるとき、 static void Main(string[] args) { MyData a = new MyData(); a.setValue( 3 ); Console.WriteLine( a.getValue().GetType().ToString() ); int i = (int)a.getValue(); } というコードを実行すると、 System.Int32 と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。 この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。 たとえば、MyData に、 public int getInt() { return (int)o; } とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。 そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。 よろしくお願いします。

  • Java 「参照型の型変換」について

    Java初心者です。 入門書を読んでいたら、「参照型の型変換」を説明している項目に 以下の方法で行うと書いてありました。 ==前提=== Personは親クラス Employeeは小クラス Engineerは孫クラス ======== (1)Engineer型からPerson型へ暗黙の型変換する場合 Person per1 = new Engineer(); (2)Person型からEngineer型へキャストする場合 Engineer eng1 = (Engineer) per1; (3)Person型からEmployee型へキャストする場合 Employee emp1 = (Employee) per1; ======== これ、変換の方法は上記で分かったのですが、 そもそも、 "何のために参照型の型変換を行うのか" "型変換を行うと、それぞれのオブジェクトの機能がどのように変わるのか" そういった説明が一切書いておらず、その意味するところが理解出来ませんでした。 スーパークラス型からサブクラス型にキャストする場合、 サブクラス型からスーパークラス型に暗黙の型変換する場合、 それぞれのオブジェクトの性質がどう変化するのでしょうか? メソッドやフィールドに対しての挙動が何か変わるのでしょうか? 基本データ型の型変換は分かり易いんですけどね。。 参照型はどうにも。。 教えて下さい!

    • ベストアンサー
    • Java
  • 型変換キャストについて

    #include <stdio.h> int main( void ) { short a = 30000, b = 10000; long c; c = a + b; printf("%ld",c) return 0; } *ただし,short:2バイト,long:4バイト このプログラムをVisual C++でコンパイルすると 結果は40000とちゃんと表示されるのは何故ですか? shortは2バイトだからshort型のa + bの値は変な値になるはずで,本来次のようにキャストが必要だと思うのですが。 #include <stdio.h> int main( void ) { short a = 30000, b = 10000; long c; c =(long) a + b; printf("%ld",c) return 0; }

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • GCCで暗黙の型変換の警告を出したい

    情報が失われてしまうような代入について警告を出したいのですが、 どういったオプションを用いればよいでしょうか? コンパイラはGCCの3.x系か4.x系でお願いします。 以下のようなソースで型変換に関する警告がほしいんです。 --- test.c --- #include <stdio.h> int main(void) {   int a = 66000;   short b;   b = a; // <- 暗黙の型変換   printf("%d\n", b);   return 0; } 実行結果 $ ./test 464 以下のオプションを試しましたが、上記のソースでは 何の警告も出ませんでした。 -W -Wall -Wconversion -Wimplicit ご存知の方いらっしゃいましたら、どうかお助け下さい。

専門家に質問してみよう