Побитови операции и типове данни


0

Здравейте,

Имам въпрос по ето този код:

 

        ushort a = 1;
        Console.Write("{0}: ", a);
        Console.WriteLine(Convert.ToString(a, 2).PadLeft(32, '0'));
        Console.Write("{0}: ", ~a);
        Console.WriteLine(Convert.ToString(~a, 2).PadLeft(32, '0'));
        Console.Write("{0}: ", (ushort)~a);
        Console.WriteLine(Convert.ToString(~a, 2).PadLeft(32, '0'));
 
Output-а на конзолата за това е следния:
 
1: 00000000000000000000000000000001
-2: 11111111111111111111111111111110
65534: 11111111111111111111111111111110
 
Конкретния ми въпрос е следния: защо трябва да кастна променливата (вариант 3) към ushort, при положение, че аз така и така съм я дефинирал като ushort или друго яче казано - защо въобще се случва вариант 2: при а = 1, ~a = -2?
 
Благодаря предварително.
 



Отговори



2
ushort не може да е отрицателно :) и затова иска cast и то не е задължително да е към ushort :) Тук превърташ типа, защото ushort не може да приема отрицателни стойности и когато извършваш cast с (ushort) го превърташ и получаваш 65534 :)

от vlad0 (6103 точки)


0
Добре, тогава кажи ми къде ми е грешката при следното разсъждение: - при типове данни, които МОЖЕ да са отрицателни, се гледа последния бит и в зависимост от това дали е 0 или 1 е положително или отрицателно; - при типове данни, които не може да са отрицателни всички битове представляват стойност. От тук идва и разликата в максималните стойности на sbyte и byte, short и ushort и т.н.
Ако тези двете неща са верни, тогава очаквам следното: 1. ползвам ushort; 2. 1 в битове е 0..0001; 3. ~1 в битове е 1..1110;
Понеже ползвам ushort, очаквам, че всички битове служат за определяне на стойност, дори и последния бит. То обаче ползва последния бит за определяне на знака. Защо се получава така?

от AlexPopov (1568 точки)

0
Резултатът от ~a е int, а не ushort и заради това се получава отрицателно число :) Така е заложено в VS :)

от vlad0 (6103 точки)