2015-07-28 70 views
0

好吧,我有4個值(A,R,G,B),並試圖將它們變成小數。當移位時爲負數

public function MergeABGR(A, R, G, B) 
Return (A << 24) + (R << 16) + (G << 8) + B 
end function 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
msgbox(MergeABGR(dim a = 255, dim r = 255, dim g = 0, dim b = 255)) 
End Sub 

從這裏得到的結果是:-65282。

我應該得到:4294902015

任何人都知道爲什麼會這樣?

Dim Decimal as Long = 4294902015 
Dim outA as integer = SplitA(Decimal, OutA) 
Dim outR as integer = SplitR(Decimal, OutR) 
Dim outG as integer = SplitG(Decimal, OutG) 
Dim outB as integer = SplitB(Decimal, OutB) 


Public Function SplitR(ABGR, ByRef R) 

    R = ABGR And &HFF 
    Return R 
End Function 
Public Function SplitG(ABGR, ByRef G) 

    G = ABGR >> 8 And &HFF 
    Return G 
End Function 

Public Function SplitB(ABGR, ByRef B) 

    B = ABGR >> 16 And &HFF 
    Return B 
End Function 

Public Function SplitA(ABGR, ByRef A) 

    A = ABGR >> 24 And &HFF 
    Return A 
End Function 

這一切後,這是結果我得到 歐塔= 255 OUTR = 255 OUTG = 0 OUTB = 255

+0

如果您使用的是顏色,則可以直接提取ARGB值。 – dbasnett

+0

將'Option Strict On'放在代碼的頂部。你的函數不指定任何返回類型。 –

回答

1

首先,打開Option Strict(參見:what's an option strict and explicit?) ,所以你必須定義一切類型。從長遠來看這將是值得的。

現在,我們要創建類型的一切,你的函數可以是這樣的:

Public Function MergeABGR(A as Byte, R as Byte, G as Byte, B as Byte) as UInt32 
    Return (Convert.ToUInt32(A) << 24) + (Convert.ToUInt32(R) << 16) + (Convert.ToUInt32(G) << 8) + B 
End Function 

當我們返回UInt32,也是參數轉換爲UInt32 S,這樣我們就不會溢出任何東西的最大值。 4294902015足夠大以至於不符合帶符號的32位整數,所以我們切換到無符號的32位整數來代替它。

+0

完美!謝謝SOOOOOOOO很多hahaha:D –