2011-07-18 5 views
1

Kernighan에서 & 리치 (Ritchie)는 "인쇄 가능한 모든 문자는 부호있는 또는 서명되지 않은 char 데이터 유형이 기계에 따라 다르지만 양의 값을 갖습니다."라고 말합니다.printf에 대한 이해 - 제공된 값이 음수이면 "% c"로 무엇이 인쇄됩니까?

누군가이 라인의 의미를 설명 할 수 있습니까? 내 시스템은 문자를 서명했지만 음수 값이 -90 인 경우에도 printf는 문자를 인쇄합니다 (그 문자는 친숙하지는 않지만).

+0

K & R이 ASCII 문자 만 사용하는 경우 놀라지 않을 것입니다. 0에서 127 사이의 값이기 때문에 모든 ASCII 문자는 부호가 있든 없든 8 비트 (또는 더 큰) 표현의 (기술적으로) 양의 정수입니다. – Mac

+0

문자의 경우 가장 중요한 바이트를 취하고 그것을 서명되지 않은 것으로 취급하십시오. 그래서 -90 = 0xFFFFFFA6 = 0xA6 = +166. –

답변

2

ASCII 문자 세트로부터 코드 포인트를 정의 0x00 ~ 0x7F. 이 범위는 양쪽 모두에 공통이기 때문에, 부호 없음 또는 부호 첨부의 byte 치로 나타내지는 관계는 없습니다.

인쇄 가능한 문자는 모두 ASCII의 일부인 0x200x7E 사이입니다. 인쇄 가능한 문자이라는 용어는 인쇄 가능한 세계에서 가능한 모든 문자를 정의하지 않습니다. 오히려 이것은 ASCII 영역 내에서 정의됩니다.

0x80에서 0xFF까지의 바이트 값은 ASCII로 정의되어 있지 않으며 다른 시스템이이 범위의 값에 다른 문자를 할당하므로 ASCII 범위에서 동일하지만이 범위가 다른 여러 유형의 코드 페이지가 생성됩니다. 또한 부호있는 바이트와 부호없는 바이트의 값이 다른 범위이기도합니다.

구현시 printf은 입력에서 %c 키를 발견하면 단일 바이트 값을 찾습니다. 이 바이트 값은 printf 함수의 호출자이므로의 호출자가 이것을 알지 못하므로 사용자의 관점에서 부호가 있거나 부호가 없을 수 있습니다. 이 8 비트를 연결된 출력 스트림으로 전달하기 만하면 해당 스트림은 0x000xff 사이의 문자를 방출합니다.

기호의 개념은 문자가 출력되는 출력 파이프 라인에서 의미가 없습니다. 따라서 255 또는 -1을 보낼 때 특정 코드 페이지의 0xFF에 매핑 된 문자가 방출됩니다.

1

-90 서명 숯은 값이 166 인의 경우에 부호 문자로 재 해석되는 바와 같이 (-90 모두 166이 헥사 0xA6이다.)

1

맞아요. 모든 이진수는 양수입니다. 당신이 그것을 부정적인 것으로 취급하든 그렇지 않든간에 그것은 당신 자신의 해석입니다. the common two's compliment 사용

8 비트 수 : 10100110은 양수 166이며 128 (양의 부호있는 최대 8 비트 수)보다 큽니다.

부호있는 arithmatic을 사용하면 번호 166이 -90입니다.

ASCII 값이 166 인 문자가 표시됩니다.

관련 문제