2017-02-02 7 views
0

私のコードの数学と変換プロセスに頭を悩ませています。私はそれがどのようにその合計に達したのか理解していますが、どのようにマイナスになったのですかバイトからintへの変換の計算

static void Main(string[] args) 
{ 
    short numb1 = 30000, numb2 = 30000; 
    short answer = (short)Add(numb1, numb2); 
    Console.WriteLine("{0} + {1} = {2}", numb1, numb2, answer); 
    NarrowingAttempt(); 
    Console.ReadLine(); 
} 

static int Add(int x, int y) 
{ 
    return x + y; 
} 

static void NarrowingAttempt() 
{ 
    byte myByte = 0; 
    int myInt = 200; 

    myByte = (byte)myInt; 
    Console.WriteLine("Value of myByte: {0}", myByte); 
} 

これが返されます。

30000 + 30000 = -5536 

少しの助けを?

答えて

1

30000 + 30000 = 60000、しかし短いのみ-32768〜32767(-2^15〜2^15 - 1)を表すことができる

したがって、オーバーフローが発生し、60000を返し - 65536(2^16) = -5536

処理するすべての値は、実際にコンピュータ内部ではバイナリ形式であることを理解する必要があります。

短いタイプは、16ビットまたは2バイトで表されます。バイナリ形式の 30000は0111 0101 0011 0000であり、バイナリ形式の 60000は1 1110 1010 0110 0000であり、最後の16ビットのみが短い値を表すために使用される。

このバイナリ値を10進値に変換することを理解するには、https://en.wikipedia.org/wiki/Twoのs_complementに関する知識が必要ですが、要するに-5536になります。 65536は、65536(2^16)の倍数は、バイナリ形式の末尾に少なくとも16 '0を持つという事実から来ています。

+0

(2 * 16)とは何ですか? – momo003

+0

これは、65536が2の16乗(2^16,2 ** 16など)であることを意味します。 –

関連する問題