왜 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에 대한 최대 값은 Integer
is 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은 정수 유형에 비해 너무 큽니다. 그게 그 이유입니다.
'program tip' 카테고리의 다른 글
homebrew로 이전 버전의 mongodb를 설치하는 방법은 무엇입니까? (0) | 2020.11.19 |
---|---|
웹 소켓이 닫히는 코드 1006으로 닫히는 이유 얻기 (0) | 2020.11.18 |
Angular 2에서 IE11 캐싱 GET 호출 방지 (0) | 2020.11.18 |
PHP가 업로드 된 파일을 임시 위치에 저장하는 이유는 무엇이며 어떤 이점이 있습니까? (0) | 2020.11.18 |
각 클라이언트에 단일 데이터베이스를 사용하면 어떤 이점이 있습니까? (0) | 2020.11.18 |