programing

VB.NET에서 부울을 정수로 변환

powerit 2023. 5. 18. 21:28
반응형

VB.NET에서 부울을 정수로 변환

다음 코드를 사용합니다.

Sub Main()

    Dim i As Integer
    Dim b As Boolean

    i = 1
    b = i
    i = b
    Console.WriteLine(i)

    i = Convert.ToInt32(b)
    Console.WriteLine(i)

End Sub

그러면 다음이 인쇄됩니다.

-1
1

왜 이러한가?

(농담입니다 :) 0도 가능합니다...

Int32.TryParse("True", i)
Console.WriteLine(i)

지금 보시는 것은 머리를 보여주는 약간의 레거시 코드입니다.

문제의 핵심은 VT_BOOL 유형입니다.Visual Basic 6.0은 부울 값으로 VT_BOOL 유형(일명 BARTION_BOOL)을 사용했습니다.VARIANT_BOOL의 True는 정수 값이 -1인 VARIANT_TRUE로 표시됩니다..NET으로 변환하는 동안 Visual Basic 변환 루틴을 사용하여 부울 값을 정수 값으로 변환할 때 Visual Basic 6.0 의미는 반환 값에서 유지되며 -1이 됩니다.

첫 번째 암묵적 변환은 b = i 라인에서 발생합니다.후드 아래에서는 정수에서 부울로 암시적 변환을 수행합니다.0이 아닌 값은 참으로 간주되므로 결과 값은 참입니다.

그러나 다음 코드 행은 정수 유형으로 암시적 변환을 수행하고 있습니다.

i = b

후드 아래에서는 Visual Basic 변환 루틴(CType 또는 CInt) 중 하나를 사용하여 값을 정수로 변환합니다.이러한 Visual Basic 의미론이 실행 중이며 반환되는 값은 -1입니다.

다음으로 흥미로운 선은Convert.ToInt32()line. Visual Basic 의미론을 사용하지 않는 .NET 변환 루틴을 사용하고 있습니다.대신 1인 실제 부울 값에 대한 기본 BCL 표현을 반환합니다.

일부 언어에서는 부울 참을 1이 아닌 -1로 간주합니다.왜 그런지 조사를 해봐야 할 것 같습니다. 기억이 안 나질 않아요.

VB6에서 상수는True가치가 있습니다.-1.

하지만,Convert.ToInt32(Boolean)는 "값이 참이면 1번, 그렇지 않으면 0번"을 반환하는 것으로 문서화되어 있습니다. 즉, 어떤 프레임워크 언어를 사용하든 마찬가지입니다.

편집: 부울 true -- 양수 1 또는 음수 1 질문 참조

True에 -1이 사용되는 이유에 대해서는 문자 그대로 (0이 아니라)이기 때문이라고 생각합니다.

0으로 시작해서 모든 비트를 뒤집고 2의 보어로 읽습니다. 음의 보어가 나옵니다.

따라서 거짓이 아닌 것은 모두 참이고 거짓은 0이므로 (거짓이 아님)은 -1로 표시됩니다.

하지만 이건 그냥 우연일 수도 있어요...

MSDN Visual Basic 설명서에서:

유형 변환

Visual Basic이 숫자 데이터 유형 값을 부울 값으로 변환하면 0은 거짓이 되고 다른 모든 값은 참이 됩니다.Visual Basic이 부울 값을 숫자 유형으로 변환할 때 False는 0이 되고 True는 -1이 됩니다.

그리고 Convert.To Int32(값):

값이 참이면 숫자 1을 반환합니다. 그렇지 않으면 0을 반환합니다.

그래서 당신 코드는:

i = 1
b = i // b becomes true
i = b // true = -1
Console.WriteLine(i)  // i is -1

i = Convert.ToInt32(b)  // Convert.ToInt32(true) = 1
Console.WriteLine(i)    // i is 1

이는 VB.NET에서 부울 값이 기본적으로 true의 경우 -1이고 false의 경우 0이기 때문입니다.왜 두 번째에 1로 출력되는지는 모르겠지만...

"참"은 숫자 데이터 유형의 0 값에서 음수입니다!

서명되지 않은 유형의 경우 Not(0)이 1을 반환합니다.

서명된 형식의 경우 Not(0)이 -1을 반환합니다.

코드를 모르겠습니다. 코드가 두 번째로 내부 데이터 변환을 수행할 수 있습니다.

이것은 모호한 대답이지만:

    Dim b As Boolean
    b = False
    Dim i As Integer
    i = IIf(b, 1, 0)

모든 숫자 데이터 유형을 부울로 사용할 수 있습니다!결과는 사용된 데이터 유형에 따라 달라집니다.

예:

Dim i As Byte    ' Byte is non-signed!
Dim b As Boolean = True

i = b            ' Set first (lowest) bit of i (non-signed byte)
' i is now binary 0000 0001 = 1!


Dim i As SByte   ' SByte is signed!
Dim b As Boolean = True

i = b            ' Set all bits of i (signed byte)
' i is now FF (binary 1111 1111 = -1 !

정수가 서명되었습니다. True to Integer -> -1.

UI 정수가 서명되지 않았습니다. -> 1에 참입니다.

등등...

잘못된 값은 서명된 숫자에서 가장 높은 비트를 지우고 서명되지 않은 숫자에서 가장 낮은 비트를 지웁니다.

따라서 모든 숫자 데이터 유형에서 거짓은 0입니다.

언급URL : https://stackoverflow.com/questions/745292/convert-boolean-to-integer-in-vb-net

반응형