2015-07-28 3 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 

После всего этого, эти результаты я получаю OUTA = 255 OUTR = 255 исх = 0 специфичны = 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 с, так что мы не перелива максимальное значение чего угодно. 4294902015 достаточно велика, чтобы не вписаться в 32-битное целое число, поэтому мы перейдем к 32-битовому целому без знака, чтобы его удерживать.

+0

Отлично! Спасибо SOOOOOOOO MUCH hahaha: D –

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