Blog

2 August 2019

c언어 비트연산 예제

이 예제의 코드는 이중 형식에 52개의 중요한 비트가 있고 손실 없이 32비트 정수 값을 저장할 수 있기 때문에 32비트 시스템의 경우 정당화될 수 있습니다. 그러나 64비트 정수 값을 두 배로 저장하려고 하면 정확한 값이 손실될 수 있습니다(그림 13 참조). 64비트 오류의 좋은 예는 가상 함수의 정의에 잘못된 인수 형식을 사용하는 것입니다. 보통은 자신의 실수가 아니라 단지 “사고”입니다. 그것은 누구의 잘못이 아니다, 하지만 오류는 여전히 남아있다. 다음 사례를 고려하십시오. 음수를 다르게 계산합니다. 모든 0으로 시작하고 1을 계산하는 대신, 우리는 모두 1로 시작하고 -1에서 시작하여 0을 계산합니다. 위의 이 서명된 짧은 int 예제를 살펴보십시오: 한 줄의 코드를 작성하기 전에 먼저 modulo-2 바이너리 분할의 메커니즘을 살펴보겠습니다. 그림 1의 예제를 사용하여 안내하겠습니다.

나눌 숫자는 끝에 0으로 보강된 메시지입니다. 메시지에 추가된 0비트 의 수는 체크섬의 너비(c라고 부르는 것)와 같습니다. 이 경우 4개의 비트가 추가되었습니다. 제수는 생성기 다항식이라고 하는 c+1비트 번호입니다. CRC는 컴퓨터 간에 저장 되거나 전송되는 데이터의 손상을 감지할 수 있는 강력한 유형의 체크섬입니다. 일반적으로 CRC는 전용 하드웨어에서 가장 효율적으로 계산됩니다. 그러나 경우에 따라 임베디드 시스템에서 실행되는 C 또는 C++ 프로그램에서 와 같은 소프트웨어에서 CRC를 계산해야 합니다. 값을 n비트로 오른쪽으로 이동하면 값을 n으로 위산된 2의 힘으로 나누고 값을 n비트로 왼쪽으로 이동하면 값을 n으로 상승하는 2의 전력을 곱하는 효과가 있다. 예를 들어 C++에서 printf 및 scanf와 같은 다양한 수의 인수가 있는 함수를 사용하는 것은 잘못된 스타일로 간주되지만 여전히 널리 사용됩니다.

이러한 함수는 64비트 시스템을 포함하여 응용 프로그램을 다른 시스템으로 포팅하는 동안 많은 문제를 일으킵니다. 예를 들어: 이 예제 프로그램에서는 위에 표시된 대로 비트 현명한 작업이 수행되고 출력이 소수점 형식으로 표시됩니다. 위의 예제는 -1 + -32,767이며 소수점 수 표기이인 -32,768이며 서명된 짧은 int 데이터 형식의 최소 값입니다. 다시 말하지만 서명된 데이터 형식에 대한 네거티브는 모두 1로 시작하여 0을 계산합니다. 아래 예제를 보십시오. 이전 블로그 게시물에서 나는 간단한 예제로 64 비트 오류를 설명하는 것이 어려운 이유를 말하겠다고 약속했습니다. … 시프트는 오른쪽 또는 왼쪽 중 어느 방향으로서명되지 않은 정수에서 수행될 때 논리로 호출됩니다.

Bize Ulaşın