나는 C의 초보자 그리고 난 같은 문장이 있습니다 7
로 답을 생산내부적으로
printf("%d",(1^6));
합니다. 나는 ^
이 xor 연산자임을 압니다. I 여기서, 1
은 의 4 비트과 같으며 0001
과 6
은 0110
과 같이 표시됩니다. xor를 수행하면 7
인 결과가 0111
이됩니다.
내 가정이 맞습니까? C 언어의 경우 숫자가 내부적으로 어떻게 표현됩니까?
미리 감사드립니다.
나는 C의 초보자 그리고 난 같은 문장이 있습니다 7
로 답을 생산내부적으로
printf("%d",(1^6));
합니다. 나는 ^
이 xor 연산자임을 압니다. I 여기서, 1
은 의 4 비트과 같으며 0001
과 6
은 0110
과 같이 표시됩니다. xor를 수행하면 7
인 결과가 0111
이됩니다.
내 가정이 맞습니까? C 언어의 경우 숫자가 내부적으로 어떻게 표현됩니까?
미리 감사드립니다.
여기에는 두 가지 다른 점이 있습니다.
C 언어 표준
는 리터럴1
및
6
형
int
을 가지고, 상기 XOR 연산을 따라서
int
유형을 사용하여 수행되는 것을 말한다.
또한 C 언어 표준은 int
유형이 2의 증가하는 지수에서 최소값부터 최대 값까지 실행되는 2 진 표현식과 숫자가 모두 양수이기 때문에 여기에는 관련이없는 부호 비트를 추가한다고합니다 , 선택적으로 일부 패딩 비트 (그리고 나는 int
에 패딩 비트가있는 C 구현을 사용한 적이 없다).
1
은
7
가
111
입니다
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
보다 작습니다.
이 종류의 세부 사항은 컴파일러, 대상 아키텍처, 최적화 수준 및 기타 컴파일러 옵션에 따라 다릅니다.
숫자 (또는 오히려 - 값)는 컴퓨터가 빌드되는 방식으로 표현됩니다. 컴퓨터가 4 비트 단어를 사용하여 작성된 경우 - 설명 된대로입니다. 현대 컴퓨터는 단어 당 32 비트 또는 64 비트를 사용하며 빅 엔디안 표현과 리틀 엔디안 표현이 있습니다.
또한 분수 표현은 매우 다양하며 몇 가지 다른 표준이 있습니다.
이것은 다양한 프로그래밍 언어에 따라 다를 수 있습니다 (대부분 유사한 개념과 표준을 사용하지만).
결국 모든 것이 비트와 바이트로 축소되었습니다.
정수로 표시되는 비트 수는 아키텍처에 따라 다릅니다. 예 : 32 또는 64 비트.
숫자 1은 int이며 32 비트 아키텍처에서는 4 바이트 또는 32 비트로 나타냅니다.
@ 스티브 - 오, 지금 무슨 뜻인지 보시라. 나는 "8 비트"가 아닌 각각 8 비트를 포함하는 4 바이트를 의미했습니다. 이런! :) 나는 내 대답을 수정합니다. –
C는 해석 언어가 아니기 때문에 정수 (부동 소수점 또는 문자)의 "내부 표현"이 없습니다. C 언어 표준에는 다른 유형 인 이 있어야하는 비트 수가 제한되어 있거나 정의되어야하며 언어의 다른 유형과 비교 된 최소 비트 수가이어야합니다.
결국 아키텍처는 실행 중에 정수가 가질 비트 수에 영향을 미칩니다. 이 특별한 경우에는 8 비트로 충분할 수도 있지만 생성 된 기계 코드/어셈블러를 검사해야합니다.
+1 훌륭한 답변 :) –