2012-03-30 7 views
1

나는 C의 초보자 그리고 난 같은 문장이 있습니다 7로 답을 생산내부적으로

printf("%d",(1^6)); 

합니다. 나는 ^이 xor 연산자임을 압니다. I 여기서, 1의 4 비트과 같으며 000160110과 같이 표시됩니다. xor를 수행하면 7 인 결과가 0111이됩니다.

내 가정이 맞습니까? C 언어의 경우 숫자가 내부적으로 어떻게 표현됩니까?

미리 감사드립니다.

답변

5

여기에는 두 가지 다른 점이 있습니다.

C 언어 표준

는 리터럴 16int을 가지고, 상기 XOR 연산을 따라서 int 유형을 사용하여 수행되는 것을 말한다.

또한 C 언어 표준은 int 유형이 2의 증가하는 지수에서 최소값부터 최대 값까지 실행되는 2 진 표현식과 숫자가 모두 양수이기 때문에 여기에는 관련이없는 부호 비트를 추가한다고합니다 , 선택적으로 일부 패딩 비트 (그리고 나는 int에 패딩 비트가있는 C 구현을 사용한 적이 없다).

그래서 그 점에서, 당신 말이 맞아요 : 17111입니다 6 이진 110로 표현되고, 바이너리 1로 표현, 플러스 초기 0은 유형 int의 크기를 구성하기에 충분가된다. 이진수를 쓸 때 우리는 그 타입이 32 비트라는 것을 알고도 00000000000000000000000000000001을 쓰는 것을 거의 신경 쓰지 않습니다.

int의 값 + 부호 비트 수는 대부분의 구현에서 32입니다. 64 또는 심지어 16이 표시 될 수도 있습니다. 표준에는 16 이상이 필요하지만 모든 번호를 허용해야합니다.

int은 일반적으로 2 바이트 이상의 저장 공간을 차지합니다. 표준은 최하위 비트가 첫 번째 (최하위 주소) 바이트인지, 마지막 (최상위 주소 지정) 바이트인지 또는 중간의 어딘가에 있는지 여부를 나타내지 않습니다. 따라서 리틀 엔디안 및 빅 엔디안 표현을 허용하고 이론적으로는 "중간 엔디안"표현도 사용합니다 (적어도 int은 해당되지 않습니다). 엔디안은 메모리에있는 int의 표현과 관련이 있지만 비트 연산 (XOR 포함)과는 관련이 없습니다. 비트 연산 (메모리에서의 순서가 아닌)에 따라 비트 순서로 정의됩니다.

표준에 모두 나와 있지만 표준에서는 "추상 기계"의 동작 만 설명한다고합니다. 컴파일러가 실제로 인 경우은 표준이 말하는 것과 동일한 결과를 가져야하지만 프로그램 실행시 메모리에 정확하게 표시되는 코드 스 니펫이 필요하지 않습니다. 원하는 경우 컴파일러가 printf("7"); 또는 심지어 fputc('7', stdout);에 대해 방출하는 것과 동일한 코드를 방출하는 것은 매우 합법적입니다. 그래서 방출 된 코드에는 1의 표현이 없을 수도 있습니다. printf 라이브러리의 일부를 구현하고 컴파일러가 "%d" 그 라이브러리에 무엇을 의미하는지 예측 귀찮게하지 않는 경우

는 어쩌면 그것은 단지, printf("%d", 7);로까지 최적화합니다. 어쩌면 런타임에 계산을 수행하지만, 1을 나타내지 만, 컴파일러가 다른 크기가 동일한 결과를 산출한다는 자체 만족도를 입증하는 한 타겟 CPU에 대해 가장 소형 및/또는 효율적이라고 생각합니다. 예를 들어, 일부 명령어 세트는 명령어의 일부로 저장된 작은 정수인 소위 "즉 치값"을 허용합니다. 1의 표현은 끝 부분에 1을 갖는 0의 숫자가 될 수 있지만, 즉각적인 명령어는 내부에 들어야하기 때문에 일반적으로 int보다 작습니다.

이 종류의 세부 사항은 컴파일러, 대상 아키텍처, 최적화 수준 및 기타 컴파일러 옵션에 따라 다릅니다.

+0

+1 훌륭한 답변 :) –

3

숫자 (또는 오히려 - )는 컴퓨터가 빌드되는 방식으로 표현됩니다. 컴퓨터가 4 비트 단어를 사용하여 작성된 경우 - 설명 된대로입니다. 현대 컴퓨터는 단어 당 32 비트 또는 64 비트를 사용하며 빅 엔디안 표현과 리틀 엔디안 표현이 있습니다.

또한 분수 표현은 매우 다양하며 몇 가지 다른 표준이 있습니다.

이것은 다양한 프로그래밍 언어에 따라 다를 수 있습니다 (대부분 유사한 개념과 표준을 사용하지만).

결국 모든 것이 비트와 바이트로 축소되었습니다.

1

정수로 표시되는 비트 수는 아키텍처에 따라 다릅니다. 예 : 32 또는 64 비트.

숫자 1은 int이며 32 비트 아키텍처에서는 4 바이트 또는 32 비트로 나타냅니다.

+0

@ 스티브 - 오, 지금 무슨 뜻인지 보시라. 나는 "8 비트"가 아닌 각각 8 비트를 포함하는 4 바이트를 의미했습니다. 이런! :) 나는 내 대답을 수정합니다. –

0

C는 해석 언어가 아니기 때문에 정수 (부동 소수점 또는 문자)의 "내부 표현"이 없습니다. C 언어 표준에는 다른 유형 인 이 있어야하는 비트 수가 제한되어 있거나 정의되어야하며 언어의 다른 유형과 비교 된 최소 비트 수가이어야합니다.

결국 아키텍처는 실행 중에 정수가 가질 비트 수에 영향을 미칩니다. 이 특별한 경우에는 8 비트로 충분할 수도 있지만 생성 된 기계 코드/어셈블러를 검사해야합니다.

관련 문제