programing

산술 연산으로 오버플로가 발생했습니다. (정수 추가)

easyjava 2023. 6. 3. 08:50
반응형

산술 연산으로 오버플로가 발생했습니다. (정수 추가)

이 오류를 이해할 수 없습니다.

이 메서드에 대한 호출에서는 볼륨 설정, 볼륨 = 2055786000 및 크기 = 93552000.볼륨은 정수 속성이며 크기도 정수입니다.

클래스는 dbml 엔티티 클래스의 부분 클래스이지만 이 볼륨 속성은 데이터베이스의 열이 아니며 부분 클래스에만 "비즈니스 개체 속성"으로 존재합니다.

세부 정보 보기 표시:

Data > Item : 인덱싱된 속성을 평가하기 위해서는 속성이 자격이 있어야 하며, 사용자가 인수를 명시적으로 제공해야 합니다.

alt 텍스트

무엇이 원인일까요?

(서명된) 정수의 최대값은 다음과 같습니다.2147483647이 값이 초과되면 프로그램의 예기치 않은 동작을 방지하기 위해 예외가 발생합니다.

만약 그 예외가 적용되지 않는다면, 당신은 다음과 같은 가치를 갖게 될 것입니다.-2145629296당신을 위하여Volume아마 원치 않을 겁니다

솔루션:an을 사용Int64용량에 맞게.최대값:9223372036854775807당신은 아마도 더 안전한 쪽에 있을 것입니다.

int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue

따라서 이 숫자를 정수로 저장할 수 없습니다.최대값이 다음과 같은 Int64 유형을 사용할 수 있습니다.9,223,372,036,854,775,807.

단순성을 위해 바이트를 사용합니다.

byte a=250;
byte b=8;
byte c=a+b;

a, b, c가 'int'이면 258을 예상할 수 있지만 'byte'의 경우 예상 결과는 2(258 & 0xFF)가 되지만, Windows 애플리케이션에서는 콘솔에서 예외가 발생할 수 있습니다(IDE에 따라 다르겠지만, 이 경우 샤프 개발을 사용합니다).

그러나 때때로 이러한 동작이 필요합니다(예: 결과의 하위 8비트에만 관심이 있음).

다음 작업을 수행할 수 있습니다.

byte a=250;
byte b=8;

byte c=(byte)((int)a + (int)b);

이렇게 하면 'a'와 'b'가 모두 'int'로 변환되고, 추가된 다음 'byte'로 다시 캐스팅됩니다.

안전을 위해 다음을 시도할 수도 있습니다.

...
byte c=(byte)(((int)a + (int)b) & 0xFF);

또는 이러한 행동을 정말로 원한다면 위의 훨씬 간단한 방법은 다음과 같습니다.

unchecked
{
    byte a=250;
    byte b=8;
    byte c=a+b;
}

또는 변수를 먼저 선언한 다음 '확인되지 않음' 섹션에서 계산을 수행합니다.

또는 오버플로 검사를 강제로 수행하려면 '체크됨'을 대신 사용합니다.

이것으로 일이 해결되기를 바랍니다.

누르치

추신.

저를 믿으세요, 그 예외는 당신의 친구입니다 :)

결과 정수 값이 정수 데이터 유형이 유지할 수 있는 범위를 벗어났습니다.

Int64를 사용해 보십시오.

최대값은 2147483647이므로 2055786000+93552000 > 2147483647로 오버플로가 발생했습니다.

2^31보다 큰 2055786000 + 93552000 = 2149338000입니다.따라서 4바이트로 코딩된 부호 있는 정수를 사용하는 경우 작업 결과가 맞지 않고 오버플로 예외가 발생합니다.

int의 최대 크기는 2147483647입니다.훨씬 더 큰 Int64/Long을 사용할 수 있습니다.

이 오류는 값이 -1로 반환되었을 때 발생했습니다.#0에 의한 나눗셈으로 인한 IND.여기 SO와 John Cook의 C++에서의 IEEE 부동 소수점 예외에 대한 자세한 정보

이 답변을 거부한 사람(이유를 명시하지 않음)에게 이 답변이 일부에게 중요할 수 있는 이유는 0으로 나눗셈하면 무한히 큰 수가 되므로 Int32(또는 Int64)에 맞지 않는 값이 발생하기 때문입니다.따라서 수신되는 오류는 동일하지만(산술 연산으로 인해 오버플로가 발생함) 그 이유는 약간 다릅니다.

언급URL : https://stackoverflow.com/questions/4756542/arithmetic-operation-resulted-in-an-overflow-adding-integers

반응형