講義メモ ・p.056「組み込み型とは」から p.056 組み込み型とは ・C#のデータ型には、あらかじめ用意されている組み込み型と、プログラマが定義できるとユーザ定義型がある。 ・すでに登場したstring、doubleは組み込み型で、doubleは基本型、stringは参照型に分類される ・基本型は1個の大きさが決まっている型で、整数型、実数(浮動小数点数)型、文字型、論理型がある。 ・整数型は大きさが4種類あり、種類ごとに符号有りと符号無し(0と正の数のみ)がある。 ・整数型:符号有り4種類 ①sbyte 8ビット -128~127 ②short 16ビット -32,768~32,767 ③int 32ビット -2,147,483,648~2,147,483,647 ※整数型の代表 ④long 64ビット -9223372036854775808~9223372036854775807 ・整数型:符号無し4種類 ①byte 8ビット 0~255 ②ushort 16ビット 0~65535 ③uint 32ビット 0~4294967296 ④ulong 64ビット 0~18446744073709551616 ・実数型:3種類(全て符号有り ①float 32ビット -3.402823E+38~3.402823E+38 単精度浮動小数点数用(誤差が大きい) ②double 64ビット -1.79769313486232E+308~1.79769313486232E+308 倍精度浮動小数点数用(誤差が小さい) ③decimal 128ビット :-79228162514264337593543950335~79228162514264337593543950335 誤差がほぼ無い(ほぼ-7.9E+29~7.9E+29) ミニ演習 mini056.cs ・整数型、実数型の最大値、最小値は「型名.MaxValue」「型名.MinValue」で得られることを確認しよう ・実数型の最大値、最小値が指数表記になることを確認しよう ⇒指数表記は実数を「●×10の±■乗」に変換して「●E±■」という書式にしたもの。  ●が1.0~9.999…になるように■を調整するのが一般的。  (0.0~0.999…になるように調整する形式もある)  例:314.1592 ⇒ 3.141592×10の2乗 ⇒ 3.141592E+2 作成例 using UnityEngine; public class mini056 : MonoBehaviour { void Start() { Debug.Log("sbyte Min:" + sbyte.MinValue + " Max:" + sbyte.MaxValue); Debug.Log("short Min:" + short.MinValue + " Max:" + short.MaxValue); Debug.Log("int Min:" + int.MinValue + " Max:" + int.MaxValue); Debug.Log("long Min:" + long.MinValue + " Max:" + long.MaxValue); Debug.Log("byte Min:" + byte.MinValue + " Max:" + byte.MaxValue); Debug.Log("ushort Min:" + ushort.MinValue + " Max:" + ushort.MaxValue); Debug.Log("uint Min:" + uint.MinValue + " Max:" + uint.MaxValue); Debug.Log("ulong Min:" + ulong.MinValue + " Max:" + ulong.MaxValue); Debug.Log("float Min:" + float.MinValue + " Max:" + float.MaxValue); Debug.Log("double Min:" + double.MinValue + " Max:" + double.MaxValue); Debug.Log("decimal Min:" + decimal.MinValue + " Max:" + decimal.MaxValue); } } p.056 組み込み型とは(つづき) ・文字型 ①char 16ビット(半角文字であっても16ビット)文字1文字のみ ・論理型 ①bool 情報量としては1ビット分 真偽(true/false)のみ ・文字列型(参照型) ①string 参照型で文字列の参照(≒位置情報)を持つ p.056 補足:組み込み型の使い分け ・整数型は内部的にint型で扱われるので、int型にしておくと効率が良い ・実数型は内部的にdouble型で扱われるので、double型にしておくと効率が良い ・ただし、大量のデータを扱うにはbyte、shortなどにしてメモリを節約可能 ・また、Unityでは内部的にflortを用いることが多い ・符号無し型は、絶対に負の数にはならない場合などに用いるとトラブルを防止できる p.056 補足:組み込み型と整数/実数リテラル ・テキストp.056「代表的な組み込み型」の「値の書き方」は型に対応するリテラルの書式の説明になっている ・整数リテラルはint型扱いになる(sbyte/short型にも代入可能) ・なお、int型の範囲を超える整数リテラルは値に応じて自動的にuint、long、ulong型扱いになる ・整数リテラルの末尾に「u」または「U」をつけることでuint型扱いを明示できる ・整数リテラルの末尾に「l」または「L」をつけることでlong型扱いを明示できる(※通常「l」は推奨されない) ・整数リテラルの末尾に「ul」または「UL」をつけることでulong型扱いを明示できる ・実数リテラルはdouble型扱いになる(指数表記も可能だが、float/decimalには代入できない) ・実数リテラルの末尾に「f」または「F」をつけることでfloat型扱いになる ・実数リテラルの末尾に「m」または「M」をつけることでdecimal型扱いになる ミニ演習 mini056a.cs ・上記を試すプログラムを作ろう ・すべての整数型、実数型の変数を初期化して表示すればよい ・文法エラーになるものはコメントアウトしよう 作成例 using UnityEngine; public class mini056a : MonoBehaviour { void Start() { sbyte sb = 100; Debug.Log("sbyte : " + sb); // sbyte sb = 300; Debug.Log("sbyte : " + sb); 範囲超過でエラー short sh = 100; Debug.Log("short : " + sh); // short sh = 90100; Debug.Log("short : " + sh); 範囲超過でエラー int it = 100; Debug.Log("int : " + it); // int it = 2200000000; Debug.Log("int : " + it); 範囲超過でエラー long lo = 2200000000; Debug.Log("long : " + lo); long ln = 2200000000L; Debug.Log("long : " + ln); //「L」で明示可能 byte by = 100; Debug.Log("byte : " + by); //byte by = -100; Debug.Log("byte : " + by); 負の数不可でエラー ushort us = 100; Debug.Log("ushort : " + us); uint ui = 2200000000; Debug.Log("uint : " + ui); //「U」省略可 uint un = 2200000000U; Debug.Log("uint : " + un); //「U」で明示可能 ulong ug = 2200000000; Debug.Log("ulong : " + ug); //「UL」省略可 ulong ul = 2200000000UL; Debug.Log("ulong : " + ul); //「UL」で明示可能 //float fl = 3.14; Debug.Log("float : " + fl); //3.14はdouble型なのでエラー float fl = 3.14F; Debug.Log("float : " + fl); //「F」で明示必須 double du = 3.141592E+2; Debug.Log("double : " + du); //指数表記可 //decimal dc = 3.14; Debug.Log("decimal :" + dc); //3.14はdouble型なのでエラー decimal dc = 3.14M; Debug.Log("decimal :" + dc); //「M」で明示必須 } } p.056 補足:組み込み型と文字/論理/文字列リテラル ・既出の通り、string型変数には文字列リテラルを代入できる  ※内部的には文字列リテラルが先にメモリ上に展開され、その参照が代入される  例: string atmarks = "@@@"; ・char型変数には文字リテラルを代入できる ・文字リテラルは1文字をシングルコーテーションで囲んだもの  例: char atmark = '@'; ・bool型変数には論理(真理値)リテラルを代入できる ・真理値リテラルは真偽をtrue/falseで示すもの  ※真偽は正しいかどうかではなく「あてはまる/あてはまらない」「はい/いいえ」「済/未済」などの意味に用いる  ※C/C++では整数値で論理(真理値)を扱えるが、C#ではできない p.056 型を変換する ・ある整数型から、その範囲を含む整数型へは暗黙の型変換が行われる  例: int i = 100; long l = i; //longはintの範囲を完全に含むので暗黙の型変換 ・なお、値が範囲内でも型が範囲を完全に含まなければ暗黙の型変換は行われない  例: int i = 100; uint u = i; //uintはintの範囲を完全に含まないのでエラー ・上の例の場合はプログラマの責任(判断)で強制的に型変換することが可能で、これをキャスト(型キャスト)という ・キャストの書式: (型)値または式 //変数1個でも式扱い  例: int i = 100; uint u = (unit)i; //uint型にキャストすればOK ・キャストを利用すると整数型への実数型からの代入が可能になり、小数点以下があれば切り捨てられる  例: int seisuu = (int)3.5; //int型にキャストすれば3になり代入OK ・string型へのキャストはできないが、長さゼロの文字列""への連結により、整数、実数、文字を文字列にすることができる  例: string text = "" + 30.14; //文字列"30.14"になる アレンジ演習:p.057 Chap1_11_1.cs ・以下の確認を追加しよう ・sbyte型の変数を100で初期化し、short型の変数に代入できること ・intの変数を100で初期化し、uint型にキャストすればuint型の変数に代入できること ・実数-3.5をint型にキャストすると、-3になるか-4になるのか  ⇒-3になる。0に近い方の整数になるので負の数でも見かけ上、小数点以下カットになる ・文字'@'を文字列""に連結すると、string型の変数に代入できること 作成例 using UnityEngine; public class Chap1_11_1 : MonoBehaviour { void Start() { int seisuu = (int)3.5; //キャストで小数点以下切り捨てで3になる string text = "" + 110; //連結で文字列"110"になる Debug.Log(seisuu + text); //連結で文字列"3110"になる //sbyte型の変数を100で初期化し、short型の変数に代入できる sbyte sb = 100; short sh = sb; //暗黙の型変換 Debug.Log("sh = " + sh); //100になる //intの変数を100で初期化し、uint型にキャストすればuint型の変数に代入できる int i = 100; uint u = (uint)i; //uintにキャスト Debug.Log("u = " + u); //100になる //実数-3.5をint型にキャストすると、-3になるか-4になるのか Debug.Log("-3.5をint型にキャストすると " + (int)-3.5); //-3になる //文字'@'を文字列""に連結すると、string型の変数に代入できる string s = "" + '@'; //文字列に文字を連結すると文字列 Debug.Log("s = " + s); //文字列"@"になる } } p.056 型を変換する:補足 ・全く関係のない型から型への変換は基本的にはできない ・例外として、文字型と整数型のキャストがあり、文字が内部的に整数値である文字コードで扱われているため ・例:(int)'A' ⇒ 文字'A'の文字コードである65になる(10進数に変換される) ・例:(char)66 ⇒ 文字コード66である文字'B'になる ミニ演習 mini057.cs ・上記の例を試して、結果を表示しよう ・また、文字コードを16進数(前に0xを付ける 例:0x41)で与えてみよう ※文字コードは通常、10進数ではなく16進数で扱われる 作成例 using UnityEngine; public class mini057 : MonoBehaviour { void Start() { Debug.Log("Aの文字コードは " + (int)'A'); //65 Debug.Log("文字コード66は " + (char)66); //'B' Debug.Log("文字コード0x41は " + (char)0x41); //'A'の65を16進数で指定 } } 補足: .NET型表記について ・例えばVSで「200000000」にマウスを乗せる「readonly struct System.Int32」と表示される ・この「System.Int32」がC#を含む.NETフレームワークにおける型の表現で、C#側の」エラーメッセージにおいても使われることが多い ・int、doubleなどの型名はC言語由来で、C言語の型の定義があいまいであること(例えばint型の大きさは不定)がトラブルの原因になる ・そこで、開発現場でも.NET型表記を用いる事がある(チームルールで統一することもある) ・例:  short ⇒ System.Int16  int ⇒ System.Int32  long ⇒ System.Int64  float ⇒ System.Single  double ⇒ System.Double  uint ⇒ System.UInt32  ulong ⇒ System.UInt64 提出: ミニ演習 mini057.cs 次回予告:p.058「メソッドとオブジェクト」