評價: 0 回應: 3 閱覽: 205
置頂

負數處理

大家好ㄦ

小花ㄦ要將兩個Int16數字組成Int32

Int16 a = -30 ;//1111 1111 1110 0010
Int16 b = -19456 ; //1011 0100 0000 0000

現在想把ab組合在一起成Int32(ab)//1111 1111 1110 0010 1011 0100 0000 0000

原本是想將兩個都先ToInt32將a << 16 然後(a | b)

但現在發現負數Int16轉Int32會將前面全部補1

b會變成1111 1111 1111 1111 1011 0100 0000 0000

但我想要的是0000 0000 0000 0000 1011 0100 0000 0000

也就是想要a|b結果是-1920000//11111111111000101011010000000000

但實際現在結果卻是-19456   //11111111111111111011010000000000

請問這要如何解決?

熱門回應

smiley

smiley

因為你沒有指定是Big Endian還是Little Endian
按照你給的範例直接使用預設的Little Endian來轉換

            Int16 a = -30;
            var a_bits = new BitArray(BitConverter.GetBytes(a));
            string a_bitsString = "";
            for (int i = 0; i < a_bits.Count; i++)
                a_bitsString += a_bits[i] ? "1" : "0";

            Console.WriteLine(a_bitsString);

輸出後結果為a = 0100 0111 1111 1111 與你文中指出的順序是顛倒的
所以你使用的應該是Big Endian

然後按照你文中的要求感覺就是將兩個數字的bytes組合起來
那程式碼應該是如下

            Int16 a = -30;
            Int16 b = -19456;

            List<byte> temp = new List<byte>();

            temp.AddRange(BitConverter.GetBytes(a));

            temp.AddRange(BitConverter.GetBytes(b));

            int c = BitConverter.ToInt32(temp.ToArray(), 0);

會員登入 (先登入會員才能回覆留言喔!)

Facebook留言