셀(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
'programing' 카테고리의 다른 글
함수 호출 시 목록을 *args로 변환 (0) | 2023.04.26 |
---|---|
로그인에서 요청한 데이터베이스 "테스트"를 열 수 없습니다.로그인에 실패했습니다.사용자 'xyz\'에 대한 로그인 실패ASPNET' (0) | 2023.04.26 |
재귀 파일 목록의 깊이를 제한하는 방법은 무엇입니까? (0) | 2023.04.26 |
WPF: 사용자가 드래그한 후 트리거하는 이벤트가 있는 슬라이더 (0) | 2023.04.26 |
ng server는 파일 변경을 자동으로 감지하지 않습니다. (0) | 2023.04.26 |