'&+'연산자는 무엇입니까? 왜 Int8(127) &+1은 -128입니까
3694 단어 programmingswiftios
긴 말은 짧게 하다
애플Advanced Swift Operators의 문서를 뒤적였을 때 나는 재미있는 일들을 만났다.상황은, 나는 그것을 사용한 적이 없고, 내가 참여한 프로젝트의 생산 코드에서도 그것을 보지 못했다.나는 우리가 만일을 대비해서 이 놀이를 하자고 생각한다.
다음 작업자가 주의를 끌었습니다.
&+
- 오버플로우 추가&-
-넘침감법&*
- 넘침 곱셈정수 넘침이 뭔지 물어볼지도 몰라...이 경우 "산술 연산은 위치를 표시할 수 있는 범위를 초과합니다. 최대치보다 높거나 최소치보다 낮습니다."잠시 후 우리는 예시로 그것을 해석할 것이다😎.
나는 이것이 흔히 볼 수 있는 상황이 아니라는 것을 알고 있지만, 적어도 스위프트에서 상술한 계산을 처리하는 일부 API가 우리를 기다리고 있다는 생각은 있다.본고에서 우리는
&+
만 주목할 것이다. 왜냐하면 나머지 부분은 모두 비슷한 방식으로 일하기 때문이다.정수 오버플로우로 인해 유튜브가 실패했습니다.
나는 정수 넘침이라는 화제를 신속하게 연구하여 유튜브 사이트와 관련된 재미있는 이야기와 그들이 어떻게'인트32'가 모든 동영상의'조회 횟수'를 충분히 저장할 수 있다고 가정하는 상황에서 실패하는지를 발견했다.그렇습니다. 그들은 다음과 같은 가설을 채택했습니다. 그리고 이런 가설은 그들에게 오랫동안 효과가 있었지만 갑자기 미친 바이러스 영상이 나타나서 그들의'보기 횟수'레이아웃을 파괴했습니다. 언급된 영상이 값을 초과했기 때문에'인트32'변수를 통해 저장할 수 있습니다. 이것은 음악 영상이 2147483647번을 넘었다는 것을 의미합니다.그들이 잘못을 저질렀다는 것을 인정한 후, 보기 카운터 형식은 'Int64' 로 전환되어, 9223372036854775807 (세상에... 9천만 명이 넘는) 의 보기를 대량으로 저장할 수 있다.
단순 + 연산자 부족 장면
예를 들어 우리는'Int8'(기호 8자리 정수) 유형을 사용할 수 있는데 이것은 -128에서 127까지의 값을 저장할 수 있다.
일반적으로 다음과 같은 간단한 계산을 수행합니다.
let a: Int8 = 127
let b: Int8 = 1
let sum = a + b // Compilation error 💥
우리는 '산술 연산' 127+1 (유형 'Int8' 에서) 과잉 '을 일으키는 스마트 컴파일 오류를 얻었다. 이것은 정말 훌륭하다.우리가 포괄된 것 같다. 불행하게도 컴파일러는 이런 정적/뚜렷한 장면에서만 우리를 돕는다. 다른 그가 그렇게 도움이 되지 않을 장면을 생각해 보자.func makeValue() -> Int8 { 1 }
let a: Int8 = 127
let b: Int8 = makeValue()
let sum = a + b // Runtime error 💥
이 장면은 우리에게'스레드 1: 빠른 실행 실패: 산술 넘침 '실행 오류와 예쁜 응용 프로그램 붕괴를 가져왔다.😪살려주세요!
우리는 첫 번째 예를 다시 고려할 수 있지만,
&+
연산자가 작용한다.let a: Int8 = 127
let b: Int8 = 1
let sum = a &+ b // Compilator is OK with this 🤓
보시다시피 컴파일링은 순조롭게 진행되었지만 계산 결과는 언뜻 보기에 매우 의외였다. 왜냐하면'sum'상량치를 검사한 후에 우리는 -128을 보았기 때문이다. 정말 귀신이 곡할 노릇이다!이 조작부호를 더욱 잘 이해하기 위해서 우리는 수동'Int8'덧셈과 고의적인 넘침을 조금씩 진행할 수 있다.
127번을 예로 들면 이것은'인트8'유형의 최대 값이다. 그 중에서 2진법은 011111, 최고 유효비트(MSB)의 값은 0(0은 양수, 1은 음수)이다.Int8(1)의 바이너리 표현은 0000 0001입니다.이 점을 알았으니 프리미엄 덧셈을 해보자.
좋아요!이제 모든 것이 명백해졌다. 이 계산에서
&+
연산자가 1우리의 MSB 비트로 바뀌었고 그 결과 우리는 10000000의 이진법 값을 얻었다.'Int8'유형의 상하문에서 이 값은 -128이다.유형 넘침 상황에 대해 단원 테스트를 진행할 때 간단한 방법으로 반응할 수 있습니까?
형식이 넘쳐나는지 검사할 수 있는 단원 테스트를 만들기 위해서, 'addingReportingOverflow' 방법을 사용하면, 이 방법은 작업 값의 원조와 'Bool' 값을 되돌려줍니다. 이 값은 작업이 넘쳐났는지 여부를 표시합니다.
let result = Int8.max.addingReportingOverflow(1)
'result'는 하나의 원조로 나타나는 장면에 대해 다음과 같은 값이 있다. (partialValue -128, overflow true)
원본 기사 출처: LINK리소스
Reference
이 문제에 관하여('&+'연산자는 무엇입니까? 왜 Int8(127) &+1은 -128입니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/robertherdzik/what-is-operator-for-and-why-int8-127-1-is-equal-to-128-1b8k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)