>백엔드 개발 >C++ >최신 컴퓨터에서 정보 표현 및 조작 - 2부

최신 컴퓨터에서 정보 표현 및 조작 - 2부

Linda Hamilton
Linda Hamilton원래의
2024-11-22 14:18:40764검색

Representing and Manipulating Information in modern computer - Part 2

1부 링크

주소 지정 및 바이트 순서

32비트 시스템의 4바이트 int는 4바이트를 모두 연속된 바이트 시퀀스로 저장합니다. 기계에 따라 Little endian과 Big endian의 두 가지 방식으로 저장할 수 있습니다. 자세한 내용은 다루지 않습니다. Little endian은 다음과 같이 16진수 값 0x01234567의 int(32비트에서 4바이트)를 저장합니다(시작 주소가 0x100이라고 가정).
주소/값
0x100 67
0x101 45
0x102 23
0x103 01
마찬가지로 빅 엔디안은 다음과 같습니다.
주소/값
0x100 01
0x101 23
0x102 45
0x103 67
주문의 차이를 확인하시기 바랍니다. Linux 32bit, Windows, Linux 64bit는 Little endian을 따르고 SunOS/SPARC는 Big endian을 따릅니다.

네트워크를 통해 Little endian 바이트 순서 지정 기계에서 Big endian 바이트 순서 지정 기계로 메시지를 보낼 때 문제가 발생할 수 있으므로 이는 중요합니다. 대부분의 프로그래머는 네트워킹 애플리케이션이 이러한 변환을 수행하는 방식으로 작성되기 때문에 이것이 문제라고 생각하지 않습니다. 그러나 네트워크 애플리케이션을 작성하는 경우 이를 고려해야 할 수도 있습니다.

정수 산술

두 개의 양수를 더하면 음수가 나올 수 있고 x < y는 x - y < 0.

예를 들어 int를 4비트로 저장하는 컴퓨터가 있고 두 개의 unsigned int x와 y가 있다고 가정해 보겠습니다.

부호 없는 int x = 10; // 바이너리 표현: 1010
부호 없는 정수 y = 15; // 바이너리 표현: 1111
부호 없는 int z = x y; // ???

z의 값은 25입니다. 그렇죠? 그렇죠?

글쎄요. 25를 이진 표현으로 변환하면 11001이 나오지만 앞서 언급했듯이 컴퓨터는 4비트 정수(부호 없는 경우 0-15의 값)만 저장할 수 있습니다. 그렇다면 우리 컴퓨터는 여분의 1비트로 무엇을 할 것인가? 당신 말이 맞습니다. 상위 비트(왼쪽에서 첫 번째 비트)를 삭제하고 9로 변환되는 1001을 얻습니다. 이는 16, 즉 25 mod 16=9로 모듈을 수행하는 것과 같습니다. 이러한 컴퓨터의 연산에만 국한되지 않는 동작을 오버플로라고도 합니다.

그런데 여기서 unsigned int를 사용하는 이유는 무엇입니까? 이 추가는 부호 있는 정수와 다르게 동작합니까?

답변: 예. 하지만 결과가 어떻게 되며 컴퓨터가 어떻게 되었는지 설명하기 전에 먼저 4비트 크기 정수를 사용하여 부호 있는 것과 부호 없는 것이 어떻게 다른지 이해하겠습니다.

부호 있는 정수

-8(bin rep: 1000)부터 7(bin rep: 0111)까지 양수와 음수 값을 모두 저장할 수 있습니다. 상위 비트(왼쪽에서 첫 번째 비트)는 부호 있는 정수 음수 값을 제공하고 나머지 비트는 양수를 생성하는 비트입니다. 따라서 가장 작은 숫자를 얻으려면 상위 비트를 1로, 다른 비트를 0으로 전환해야 하고, 가장 큰 숫자를 얻으려면 상위 비트를 0으로, 다른 비트를 1로 전환해야 합니다.

부호 없는 정수

0(binary rep: 0000)부터 15(bin rep: 1111)까지의 양수 값만 저장할 수 있습니다.

이제 더하기 전에 x=10과 y=15가 오버플로되므로 더 작은 것을 사용하겠습니다.
정수 x = 5; //0101
정수 y = 6; //0110
int z = x y // ???

부호 있는 고려 사항을 무시하는 경우 이진 표현은 1011이어야 합니다. 보시다시피, 상위 비트는 1로 반전되고 위에서부터 z의 값은 11이 아닌 -5(= -1*2ˆ3 2ˆ1 2ˆ0)가 됩니다.

그리고 부정적인 두 개를 추가하면 긍정적인 결과가 나올 수도 있습니다. 예:
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???

이제 z는 이진수로 10011인 -13이 됩니다(상위 비트는 음수에 대한 것입니다. 즉 -1*2ˆ4 = -16). 그러나 우리 컴퓨터는 4비트만 저장할 수 있으므로 상위 비트를 삭제하고 10진수 3인 0011이 됩니다. 또 넘치네요.

이것이 x < y는 x - y < 연산 오버플로를 제대로 처리하지 않으면 0입니다. 프로그래머로서 우리는 데이터 유형을 선택할 때 여러 시간의 디버깅 결과가 될 수 있으므로 다양한 상황에서의 용량과 동작을 고려하여 항상 주의를 기울여야 합니다.

오늘은 여기까지입니다. 여기에 있는 일부 정보가 잘못되었거나 누락된 경우 의견을 남겨주세요. 감사합니다.

위 내용은 최신 컴퓨터에서 정보 표현 및 조작 - 2부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.