programing

부울을 정수로 캐스팅하면 -1이 참입니까?

batch 2023. 5. 21. 17:43
반응형

부울을 정수로 캐스팅하면 -1이 참입니까?

다음을 사용하여 정수에 부울 값을 캐스팅하는 것처럼 보이는 VB.NET 코드를 사용하고 있습니다.CInt(myBoolean)이상한 일은 값이 참이면 -1을 반환한다는 것입니다.예:

CInt(True)  // returns -1
CInt(False) // returns 0

이것은 다른 언어에서도 흔한 일입니까?

저는 부울이 참이면 1이고 거짓이면 0이라고 생각했습니다.또한 Visual Basic은 -1을 할당하는 대신 1을 true로 지정하는 방법이 있습니까?

일반적으로 false 값은 0으로 표시되고 true 값은 0이 아닌 정수 값으로 표시됩니다.true 및 false의 구체적인 값(특히)은 신뢰할 수 없는 것으로, 잠재적으로 구현에 특정적일 수 있습니다.당신이 무엇을 하려고 하는지 잘 모르겠지만, 아마도 의존하지 않는 것이 가장 좋을 것입니다.True또는False꼭 필요한 경우가 아니라면 특정 정수 값을 갖는 것입니다.

VB의 특정 행동에 대한 가장 좋은 설명은 위키백과에서 찾을 수 있습니다.

부울 상수 True의 숫자 값은 -1입니다.이는 부울 데이터 유형이 16비트 부호 정수로 저장되기 때문입니다.이 구성에서 -1은 16개의 이진 1(부울 값 True)로 평가되고, 0은 160(부울 값 False)으로 평가됩니다.이는 정수 값 -1을 반환하는 16비트 부호 있는 정수 값 0에 대해 Not 연산을 수행할 때 명백합니다. 즉, True = Not False입니다.이 고유한 기능은 And, Or, Xor 및 Not과 같은 정수의 개별 비트에 대해 논리 연산을 수행할 때 특히 유용합니다.True의 이러한 정의는 1970년대 초 마이크로소프트 베이직 구현 이후의 베이직과도 일치하며 당시 CPU 명령의 특성과도 관련이 있습니다.

초기 사용 시 해결 방법은 다음과 같습니다.

 Dim i As Integer = CInt(Int(False))

0을 반환합니다.

 Dim i As Integer = CInt(Int(True))

1을 반환합니다.

그것은 고트카처럼 보이고, 저는 이 행동의 다른 예를 모릅니다.

데이터 유형 문제 해결(Visual Basic)은 "Don't do that, mkay"를 사용하여 이 동작을 지정합니다.아래쪽으로 더 내려가십시오.

프레임워크의 변환

시스템 네임스페이스에서 변환 클래스의 ToInt32 메서드는 True를 +1로 변환합니다.

부울 값을 숫자 데이터 형식으로 변환해야 하는 경우 사용하는 변환 방법에 주의하십시오.

나도 같은 문제를 가지고 있었고 사용했습니다.Math.Abs :) 에 대한 함수 :) 에 대한 함수 :)

MSDN 문서는 "부울 값은 숫자로 저장되지 않으며 저장된 값은 숫자와 동일하지 않습니다. True 및 False에 대해 동등한 숫자 값에 의존하는 코드를 작성해서는 안 됩니다. 가능할 때마다 부울 변수의 사용을 해당 변수가 설계된 논리적 값으로 제한해야 합니다."

1970년대와 1980년대에 했습니다.AND그리고.OR연산자를 사용하여 참 조건식이 -1(정수에 사용되는 두 개의 보어의 "all-bits-set" 값)로 평가되도록 했습니다.실제 조건식을 전체 비트 집합 값으로 평가하도록 결정한 이유가 정확히 무엇인지 모르겠습니다. 사용할 수 있습니다.AND조건식에 대해 정수를 마스킹하는 것이 곱셈보다 빠를 수 있지만, 해석기의 내부 역학을 고려할 때 차이는 미미했을 것입니다.

어쨌든 Microsoft가 PC용으로 제작한 BASIC의 첫 번째 버전은 실제 조건이 -1(all-bits-set)로 평가되는 전통을 따랐습니다. QuickBASIC은 이 조건과 호환되어야 했고 Visual BASIC은 QuickBASIC과 호환되어야 했기 때문에 동일한 표현을 사용했습니다.비록 ~일지라도.Net은 정수와 불리언을 서로 다른 유형인 VB로 인식합니다.Net은 이전 동작에 의존할 수 있는 VB6 프로그램에 대한 마이그레이션 경로를 제공하기를 원했습니다." 해제Option Strict Off"(옵션 엄격 해제)를 선택하면 VB가 표시됩니다.정수 합니다. 대부분의 는 Net의 True를 사용합니다.Option Strict On의 행동을 갖는 것은 혼란스러울 것입니다.CInt()암시적 변환 동작과 다릅니다.

테스트해 본 결과 다음과 같은 결과가 나왔습니다.

Public Module BooleanTest
Public Function GetTrue() As Boolean
    GetTrue = True
End Function
End Module

...

[StructLayout(LayoutKind.Explicit)]
struct MyStruct
{
    [FieldOffset(0)]
    public bool MyBool;
    [FieldOffset(0)]
    public int MyInt32;
}

static void Main(string[] args)
{
    MyStruct b1, b2;
    b1.MyInt32 = 0;
    b2.MyInt32 = 0;
    b1.MyBool = BooleanTest.BooleanTest.GetTrue();
    b2.MyBool = true;
    Console.WriteLine(b1.MyInt32);
    Console.WriteLine(b2.MyInt32);
}

이로 인해 다음과 같은 결과가 발생합니다.

1
1

이것이 모든 것을 증명하기를 바랍니다.True. 내부의NET 내부의 값은 항상 동일합니다. 이유는 유이는간다니합단그다니▁the.모든 .NET 구성원은 서로 통신해야 합니다.만약 그렇다면 이상할 것입니다.object.Equals(trueFromCSharp, trueFromVB)수 있습니다.trueFromCSharp == trueFromVB).

CInt는 변하는함뿐입다니일수환다▁which▁a를 변환하는 함수일 뿐입니다.True안으로-1 함수 다른함수Int돌아올 것입니다1하지만 이것들은 변환기이며, 이진수 값에 대해서는 아무 말도 하지 않습니다.

MySQL에도 부울형이 없고 tinyint(1)만 있는 것과 같은 문제가 있습니다.

데이터베이스에 값을 삽입하기 전에 값이 올바른지 확인하는 변환기 함수를 작성하는 것이 해결책이었습니다.

        Public Function BoolToMySql(bVal As Boolean) As Integer
            Dim retVal As Integer
            If bVal = True Then
                retVal = 1
            Else
                retVal = 0
            End If
                 BoolToMySql = retVal
        End Function

저는 그것이 다른 사람들이 VB.NET 안에서 불리언들과 함께 일하는 것을 도울 수 있기를 바랍니다.Roger가 작성한 VB.NET을 작성하는 더 좋은 방법은 다음과 같습니다.

Public Function BoolToMySql(bVal As Boolean) As Integer
   return  If(bVal, 1, 0)
End Function

저는 제가 작업하고 있던 특정 VBA 시나리오에 대한 다른 답변이 부족하다는 것을 발견했습니다.이는 VB.NET에서 테스트되지 않았습니다.

저는 <> 0인 임의의 주어진 숫자를 1로 만들고 If 문 없이 코드 한 줄에서 0을 0으로 유지하고 싶었습니다.제가 이 일을 하게 된 방법은, 제가 다른 주어진 대답에서 보지 못했던 것입니다.

Abs(CBool(iCount))

CBool()주어진 를 변환합니다(으(으)로 변환합니다.iCount위의불리언으로, 를 두 값, 즉 위의예를변여하가환결능으로 .True-1그리고.False0.

Abs()값 없음)을하여 그런다음절부대(음의 값 없음)을 반환합니다.0위해서False그리고.1위해서True.

과 같은 반환점이 있습니다.0:

Abs(CBool(0))
Abs(False)

은 리고다의반환은음입니다.1:

Abs(CBool(1))
Abs(CBool(-1))
Abs(CBool(-38473))
Abs(CBool(358677))
Abs(True)

저는 이것이 이와 같은 특정한 시나리오를 가지고 노는 다른 사람들에게 유용하기를 바랍니다.

조금 늦을 수도 있지만 일반적으로 True의 경우 1, False의 경우 0을 받는 간단한 해결 방법이 있습니다.

부울에 -1을 곱하면 다음과 같습니다.

CInt(True) * -1
CInt(False) * -1

그 다음엔 다시 돌아옵니다.

1
0

언급URL : https://stackoverflow.com/questions/3621037/casting-a-boolean-to-an-integer-returns-1-for-true

반응형