2017-02-02 10 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 бит используются для представления короткого значения.

Чтобы понять, как преобразовать это двоичное значение в десятичное значение, вы должны иметь некоторые знания о 0_'s_complement, но вкратце он превращается в -5536. 65536 исходит из того факта, что кратные 65536 (2^16) имеют не менее 16 '0 в конце в двоичной форме.

+0

Для чего нужен (2 * 16)? – momo003

+0

Это просто означает, что 65536 равно 2 до 16 (2^16, 2 ** 16 и т. Д.). –

 Смежные вопросы

  • Нет связанных вопросов^_^