program tip

왜 cells (1,1) = 500 * 100은 오버 플로우를 일으키지 만 50000 * 100은 그렇지 않습니까?

radiobox 2020. 11. 18. 08:54
반응형

왜 cells (1,1) = 500 * 100은 오버 플로우를 일으키지 만 50000 * 100은 그렇지 않습니까?


글쎄, 방금 간단한 하위를 만들었고 오버플로 오류가 발생합니다. 그러나 나는 코드에 잘못된 것이 없으며 50000 * 100이 500 * 100보다 훨씬 크기 때문에 정말 이상합니다.

sub add()
    'This will cause an overflow error
    cells(1,1) = 500 * 100
    'But this won't
    cells(2,2) = 50000 * 100
end sub

중히 여기다:

Sub add()
    'This works:
    Cells(1, 1) = CLng(500) * 100
    'as does this:
    Cells(2, 2) = 50000 * 100
End Sub

분명히 VBA는 Integer첫 번째 표현식 대해 기본 유형을 선택했습니다. 그 유형은 오른쪽에 리터럴을 담을만큼 충분히 크기 때문입니다. 50000은 너무 큰 Integer그것이로 해석 있도록 Long. CLng로 프로모션을 명시 적으로 트리거합니다 Long.


a에 대한 최대 값은 Integeris 32767와 그 50000이상이므로 Long유형으로 캐스트됩니다 . 따라서 결과는 잘 맞습니다 Long. 그러나 첫 번째 경우에는 모든 것이 Integer유형 으로 수행되고 오버플로됩니다.

(Integer=500) * (Integer=100) = (Integer=50000)  'Overflow
(Long=50000) * (Integer=100) = (Long=5000000)    'Ok

이것은 VBA가 수학적 표현을 평가하는 방법 때문입니다. 표현식의 반환 유형은 표현식에서 첫 번째 피연산자의 유형이거나 가장 가까운 숫자 유형이됩니다. 그러나 최종 결과가 해당 반환 유형에 맞지 않고 오버플로 오류가 발생할 수 있습니다.

500 * 100을 수행하면 반환 유형은 정수입니다. 50000 * 100을 수행 할 때이 표현식의 반환 유형은 Long입니다.

오버플로 오류를 방지하기 위해 명시 적 캐스트를 수행하여 의도를 알릴 수 있습니다.

CLng(500) * 100


다음 링크에서 답을 얻었습니다. Microsoft의 링크

숫자에 유형을 지정하지 않았어도 길이에 따라 자동으로 할당되는 것 같습니다. 따라서 500은 정수로 정의되고 결과 50,000은 정수 유형에 비해 너무 큽니다. 그게 그 이유입니다.

참고 URL : https://stackoverflow.com/questions/31816396/why-cells1-1-500-100-causes-overflow-but-50000100-doesnt

반응형