실수하기 쉬운 케이스
1. 일반적으로 for문의 i를 unsigned 변수로 쓰는건 매우 위험하다.
why? 보통 i>=0을 많이 사용하는데, 얘는 0아래로 내려갈 일이 없다. 따라서 무한루프가 발생할 수 있다.
2. >>의 나머지는 버림이라고 생각하기 쉽지만, >>는 음수일 경우 올림이다. (-1.5가 값이면 -2로 만듬)
why? 음수는 비트 1이 사라지는 것이 +1이 사라지는 것이기 때문에, -1.5로인해 버려진 비트가 값을 올린다.
3. 음수를 양수로 단순하게 만드는 것은 항상 가능한 것이 아니다.
why? 모든 자료형에서 음수의 범위가 양수의 범위보다 1 높다. ( int의 경우 양수는 2^31-1까지만 표현되지만, 음수는 -2^31까지 표현이 가능) 따라서 항상 가장 작은 수를 주의할 필요가 있다.
이로인해 ~x +x = -1은 대부분 참이지만, 가장 작은 음수에게는 적용되지 않는다.
4. 일반적인 비트연산의 오류는 가장작은 음수, Unsigned의 가장 큰 양수, overflow, bit개수, 음수의 나머지에서 발생한다.
why? 가장작은 음수, Unsigned의 가장 큰 양수는 3번의 오류가 자주 발생, overflow, bit개수는 표현 불가능으로인한 오류, 음수의 나머지의 경우 올린다는 사실을 무시하는 경우다.
알아두면 좋은 연산 방법
1. !(!x) 를 사용하면 모든 0이 아닌 수는 1이되고 0은 그대로 0이된다.
2. 여러개 bit를 모두 확인해야 할때, 그룹을 통해서 확인후 그들을 더하는 방법이 유용하다. (32개bit의 경우, 각 byte의 첫자리에만 1을 둔 int숫자와 원하는 숫자를 shift연산을 통해 연산한뒤, 4개의 자리만 확인하는 방법이 있다.)
3. ~x+1은 양수와 음수를 바꾸는 방법이기도 하지만, (~x+1)&x를 활용하면 첫 1의 자리를 알아낼 수 있다.
4. int의 경우 x>>31을 하면 음수는 -1, 0을 포함한 양수는 0이 나온다. (부호 관련 bit 연산 자주나옴)
5. 음수에 대한 나누기를 진행할때 >>연산을 커버치기 위해서는 shift로 사라진 부분에 1이 있는지 확인하고 1을 더할 필요가 있을 수 있다.
'컴퓨터 시스템' 카테고리의 다른 글
mov와 lea의 비교, 어셈블리 접미사의 의미(q, l, w,b) (0) | 2021.10.28 |
---|---|
어셈블리 operations 모음 (0) | 2021.10.15 |
assembly 각 register의 역할과 caller-saved, callee-saved. (0) | 2021.10.11 |
실수의 저장 방식 (0) | 2021.10.04 |
비트연산과 정수정리 (0) | 2021.09.27 |