programing

셀(1,1) = 500 * 100은 오버플로를 유발하지만 50000 * 100은 오버플로를 유발하지 않는 이유는 무엇입니까?

goodsources 2023. 4. 26. 23:18
반응형

셀(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에 대한 최대값Integer이라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

나는 다음 링크에서 답을 얻었습니다: 마이크로소프트 링크.

제가 번호에 유형을 지정하지 않았더라도 엑셀은 번호의 길이에 따라 자동으로 하나를 지정합니다.따라서 500은 정수로 정의되며 결과 50,000은 정수 유형에 비해 너무 큽니다.그래서.

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

반응형