이진수
-
보수를 이용해 뺄셈을 할 때 자릿수가 맞지 않는 경우개발/etc 2024. 6. 28. 15:06
9 - 6을 연산을 해보자. 9의 이진수: 10016의 이진수: 01106의 2의 보수: 1001(1의 보수) + 1 -> 10101001 + 1010 = 0011은 3이므로 잘 된다. 올림이 일어난 비트는 버려지기 때문에 문제 없다. 16 - 6을 빼면 어떨까?16의 이진수: 0001 00006의 2의 보수는 1010인데 비트 수를 맞춰야 하니까 0000 1010으로 해서 더해보면 0001 1010이 되므로 26이 나와버린다. 이렇게 된 이유는 신호 확장을 올바르게 하지 못했기 때문이다. 보수를 구해서 덧셈을 했지만 우리는 뺄셈을 해야 하는 것이다. 즉 빼는 수가 음수라는 의미. 이진법에서 음수를 표현하는 방법은 최상위 비트를 1로 두는 것인데 우리의 사례처럼 비트 수를 확장해야 하는 경우에 "신호 확..
-
BitConverter.ToIntXX() 함수 구현해보기개발/C·C++ 2019. 11. 6. 02:35
C#은 C++과 Java의 장점을 두루 갖고 있다. 비교적 늦게 태어난 언어인 만큼 단점보다는 장점이 더 많아 보인다. 네트워크 라이브러리 쓰기도 편하고 스레드도 지원을 잘한다. Java는 손을 뗀 지 조금 돼서 잘 모르겠는데, C#에는 여러 종류의 변환 함수를 지원한다. 문자열 변수를 바이트로 변환해준다든가(Encoding.UTF8.GetBytes(Name)), char형 배열에서 오프셋을 지정해 원하는 바이트만큼 읽어온다든가. 후자의 기능을 갖고 있는 함수가 BitConverter.ToIntXX() 계열의 함수다. 사실은 이 함수를 똑같이 구현하는 게 목적이 아니라 내부적으로 어떤 원리를 갖고 있는지 알아보려고 한다. 설명하려고 하는 함수는 가변 버퍼에서에서 발견할 수 있다. 서버 프로그래밍에서 가변..