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이 됩니다.
값이 참이면 숫자 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
'programing' 카테고리의 다른 글
Postgre 설치 방법Ubuntu에서 SQL의 페이지 보석? (0) | 2023.05.18 |
---|---|
사용 방법 ? : if 문에 레이저 및 인라인 코드가 차단 (0) | 2023.05.18 |
CStr() 대 Str() 대 . .문자열로() (0) | 2023.05.18 |
도커 합성을 사용하여 명명된 볼륨을 제거하시겠습니까? (0) | 2023.05.18 |
윈도우즈의 포트 전달 (0) | 2023.05.18 |