C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: int より sbyte の方が処理が軽いと思うのですが・・


(過去ログ 132 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■77922 / inTopicNo.1)  int より sbyte の方が処理が軽いと思うのですが・・
  
□投稿者/ KH (20回)-(2015/12/01(Tue) 19:12:27)

分類:[C#] 

よくネットで参考文献を調べていると何かにつけてintが例として多く出てくるような印象が私にはあります。
しかし、符号付整数であれば、sbyteの方が処理は速い様な気が下記ページを見るとするのです。
https://msdn.microsoft.com/ja-jp/library/ms228360%28v=vs.90%29.aspx
それで、int と sbyte どちらが処理が速いのか計測してみようと思ったのですが
フィールド?(こういい方でいいのか自信がないです)に整数を記載したとき
それはintとしての扱いになっている事に気づいて
ああ、なるほど、だから色んな参考文献はintでやっているのだなあと思いました。


ですがfloatであれば1000F、longであれば1000Lと表記すればいいのですが
sbyteにする方法を調べたのですがどうもうキャスト?変換?する方法が見つけられませんでした。
できないのでしょうか?できるのでしょうか?もし、やり方があれば教えて頂けましたら嬉しいです。


次にフィールド?で整数を記載した場合それが最初からsbyteになる様な
設定はできるのでしょうか?あるとすればご存知の型は教えて頂けましたら嬉しいです。
引用返信 編集キー/
■77923 / inTopicNo.2)  Re[1]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ KH (21回)-(2015/12/01(Tue) 19:17:14)
2015/12/01(Tue) 19:18:48 編集(投稿者)

追記です。試しに

string[,] a = new string[4F,4F];

こういうのを書いてみたら案の定
エラー 1 型 'float' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
となってしまいました。
つまり配列のインデックスをしていするのはintしか不可能だと思いました。
これを考えると、フィールド?に記載する整数がsbyteだと何かとキャストする処理が多くなり、あまり意味のない事になってしまいそうな気がします。

引用返信 編集キー/
■77924 / inTopicNo.3)  Re[2]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ KH (22回)-(2015/12/01(Tue) 19:20:04)
すいません。追記です。

string[,] a = new string[4L,4L];

とlongだとエラーがでませんでした。
引用返信 編集キー/
■77925 / inTopicNo.4)  Re[3]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ みい (30回)-(2015/12/01(Tue) 19:40:18)
No77924 (KH さん) に返信
> すいません。追記です。
>
> string[,] a = new string[4L,4L];
>
> とlongだとエラーがでませんでした。
配列の要素数ですもん。
整数でないといけませんわ。
引用返信 編集キー/
■77926 / inTopicNo.5)  Re[1]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ みい (31回)-(2015/12/01(Tue) 19:50:28)
No77922 (KH さん) に返信
> 1
> ですがfloatであれば1000F、longであれば1000Lと表記すればいいのですが
> sbyteにする方法を調べたのですがどうもうキャスト?変換?する方法が見つけられませんでした。
> できないのでしょうか?できるのでしょうか?もし、やり方があれば教えて頂けましたら嬉しいです。
ノーマルに(sbyte)100ではダメですか?
※sbyteは-128〜127なので1000はキャスト×
引用返信 編集キー/
■77927 / inTopicNo.6)  Re[1]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ 魔界の仮面弁士 (579回)-(2015/12/01(Tue) 20:30:10)
No77922 (KH さん) に返信
> ですがfloatであれば1000F、longであれば1000Lと表記すればいいのですが
> sbyteにする方法を調べたのですがどうもうキャスト?変換?する方法が見つけられませんでした。
キャストは括弧で囲みます。具体的には
 sbyte a = (sbyte)100;
という感じですね。ただし実際にはキャストせずに
 sbyte a = 100;
と書いても同じコンパイル結果が得られます。(範囲外の値の代入はコンパイルエラーになります)



> 次にフィールド?で整数を記載した場合それが最初からsbyteになる様な
> 設定はできるのでしょうか?あるとすればご存知の型は教えて頂けましたら嬉しいです。

C# の言語レベルでいうと、整数リテラルとして記述できるのは、
Int32 / UInt32 / Int64 / UInt64 の 4 種類だけであり、
SByte / Byte / Int16 / UInt16 型の整数リテラル表現はありません。
https://msdn.microsoft.com/ja-jp/library/aa664674.aspx


一方、MSIL レベルで言えば、8bit の値をスタックに積むために、
「ldc.i4.s num」という命令が用意されています。
(load constant, interger 4-bytes, short-form の意味ですね)

これはバイナリでは [1F]<int8> という 2 バイト命令であり、
-128〜128 の範囲の「int32 の整数」をスタックに積むことができます。


しかし、「-1〜8 の範囲の int32」の場合には、より効率よく
1 バイトの命令で記述できるようになっています。

 [15] ldc.i4.m1 「int32 -1 をスタックに積む」
 [16] ldc.i4.0  「int32 0 をスタックに積む」
 [17] ldc.i4.1  「int32 1 をスタックに積む」
 [18] ldc.i4.2  「int32 2 をスタックに積む」
 [19] ldc.i4.3  「int32 3 をスタックに積む」
 [1A] ldc.i4.4  「int32 4 をスタックに積む」
 [1B] ldc.i4.5  「int32 5 をスタックに積む」
 [1C] ldc.i4.6  「int32 6 をスタックに積む」
 [1D] ldc.i4.7  「int32 7 をスタックに積む」
 [1E] ldc.i4.8  「int32 8 をスタックに積む」


上記以外の範囲の int32 の場合には、「ldc.i4 num」という命令を使います。
こちらは [20]<int32> なので、コマンド長としては長くなりますね。
引用返信 編集キー/
■77930 / inTopicNo.7)  Re[3]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ 魔界の仮面弁士 (580回)-(2015/12/01(Tue) 21:59:16)
No77924 (KH さん) に返信
> string[,] a = new string[4L,4L];
> とlongだとエラーがでませんでした。

C# 言語仕様上は「int, uint, long, ulong」のみが許可されます。


No77923 (KH さん) に返信
> string[,] a = new string[4F,4F];
> 型 'float' を 'int' に暗黙的に変換できません。明示的な変換が存在します。

「int, uint, long, ulong」への『明示的な変換』ではなく、
「int, uint, long, ulong」への『暗黙的な変換』が可能な型の場合は、
それらの型を指定することができます。


詳しい定義を知りたいのであれば、
ISO/IEC 23270:2006 (JIS X 3015:2008) の
14.5.6.1 の項を参照してみてください。
引用返信 編集キー/
■77931 / inTopicNo.8)  Re[4]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ 魔界の仮面弁士 (581回)-(2015/12/01(Tue) 22:05:55)
No77930 (魔界の仮面弁士) に追記
>> string[,] a = new string[4F,4F];
>>型 'float' を 'int' に暗黙的に変換できません。明示的な変換が存在します。
> 「int, uint, long, ulong」への『明示的な変換』ではなく、
> 「int, uint, long, ulong」への『暗黙的な変換』が可能な型の場合は、
> それらの型を指定することができます。

というわけで、こんな指定も可能だったりします。


static void Main(string[] args)
{
  KH x = 4F;
  KH y = 4F;
  string[,] b = new string[x, y];
}

struct KH
{
  public float F;
  public static implicit operator uint(KH s)
  {
    return uint.Parse(s.F.ToString());
  }
  public static implicit operator KH(float f)
  {
    return new KH { F = f };
  }
}
引用返信 編集キー/
■77933 / inTopicNo.9)  Re[2]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ KH (23回)-(2015/12/02(Wed) 00:05:33)
皆さまご回答ありがとうございます。
思った以上に良きご回答を頂きました。
嬉しいです。
解決済み
引用返信 編集キー/
■78020 / inTopicNo.10)  Re[3]: int より sbyte の方が処理が軽いと思うのですが・・
□投稿者/ Jitta (3回)-(2015/12/08(Tue) 08:33:01)
No77933 (KH さん) に返信

なぜ、sbyteで処理する方が速いと思ったのだろう?
その疑問がありながら、なぜリテラル値をsbyteととして扱わないことに疑問を感じなかったのだろう?
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -