2013-05-15 3 views
1

나는 휴대용 방식으로 문자의 크기를 안정적으로 결정하는 방법을 궁금해하고있었습니다. AFAIK sizeof (char)는 바이트가 16 비트 이상인 시스템에서도 항상 1을 산출하므로 사용할 수 없습니다.신뢰할 수있는 문자 크기 결정

예를 들어, 비트를 처리 할 때 정확히 얼마나 큰지 알고 싶다면이 코드가 실제 크기의 문자를 제공하는지, 컴파일러가 생각하는 것과는 관계가 없는지 궁금합니다. IMO 포인터를 컴파일러에서 올바른 크기로 늘려야하므로 올바른 값을 가져야합니다. 이것에 맞습니까, 아니면 포인터 연산에 숨겨진 문제가있을 수 있습니다. 이는 일부 시스템에서 잘못된 결과를 산출 할 수 있습니까?

int sizeOfChar() 
{ 
    char *p = 0; 
    p++; 
    int size_of_char = (int)p; 
    return size_of_char; 
} 
+0

'CHAR_BIT' 또는'CHAR_MAX'는 간단한 휴대용 메소드입니다. –

+0

'sizeof' 연산자도 있습니다. 단지 sizeof (char)가 – abasu

+0

크기가 항상 유용하지는 않습니다. 왜냐하면 char가 8 비트인지 또는 다른 것이 필요한지 알 필요가 있기 때문입니다. Sizeof는이 정보를 제공하지 않습니다. – Devolus

답변

6

"올바른"(또는 "신뢰할 수있는"것으로 간주되는) 제목이 명확하지 않다고 생각합니다.

"1 바이트는 8 비트"를 올바른 대답이라고 생각하십니까? 그렇다면, CHAR_BIT 다음 당신은 물론 단지 계산하여 답변을 얻을 것이다, 16 플랫폼에 대한 :

const int octets_per_char = CHAR_BIT/8; 

포인터 속임수를 할 필요가 없습니다. 또한, 속임수가 까다 롭다 : 메모리의 가장 작은 조각으로 16 비트를 갖는 아키텍처

는 등 주소 0000 1 16 비트 어드레스 0001의 다른 16 비트로하고있을 것이다.

그래서 포인터가 0x0000에서 0x0001까지 증가 할 것이므로 결과는 1을 계산하지만 계산할 것으로 기대하지는 않습니다.

간결성을 위해 16 비트 주소 공간을 사용하므로 주소를 읽기 쉽습니다.

+0

사실 이것은 정확히 내가 알고 싶었던 것입니다. 나는 메모리 주소가 항상 8 비트의 덩어리로 존재할 것이라고 기대할 것이다. 그러나 물론이 가정은 어떤 시스템에서는 틀릴 수도있다. 따라서 나의 질문이다. 나는 12 비트 또는 다른 것들을 가진 오래된 머신이 있다는 것을 알고있다. 그래서 그러한 시스템에서 포인터 산술은 아마도 틀릴 것이다. – Devolus

+3

메모리 주소는'CHAR_BIT'와 char의 실제 크기를 정의하는 것이지 다른 방법은 아닙니다. char는 하나의 "주소 슬롯"에 맞는 데이터 단위입니다. –

7

는 이름에서 알 수 정확히 평가 <limits.h>에 정의 된 CHAR_BIT 매크로가있다.


는 IMO 포인터가 올바른 크기 컴파일러 증가되어야하므로 포인터 연산이 sizeof(T)으로 정의되어 있기 때문에, 우리는 (그 정확한 값

없음을 가져야 포인터 대상 유형)이며 연산자 sizeof은 크기를 바이트로 나타냅니다. char은 항상 정확히 1 바이트 길이이므로 코드는 항상 NULL 포인터와 1을 더한 값을 갖습니다.는이 0이 아니기 때문에 숫자 값이 1이 아닐 수도 있습니다.

+0

그건 알지 못했지만, 그것에 대해 알지 못했지만,이 코드가 어떤 정의와도 관계없이 올바른 결과를 신뢰할 수있게 반환 할 것이라는 질문에 대해서는 대답하지 않습니다. – Devolus

+0

@Devolus "이 코드"는 무엇입니까? 귀하의 코드 또는이 매크로? –

+0

예, 물론 코드입니다. 시스템 매크로가 유효해야한다고 가정합니다. :) – Devolus

2

비트 단위로 한 char (일명 바이트)의 크기는 CHAR_BIT<limits.h> (또는 C++의 경우 <climits>) 매크로로 결정됩니다. sizeof 연산자는 항상 바이트가 아닌 형식으로 바이트의 크기를 반환합니다.

어떤 시스템에서는 CHAR_BIT이 16이고 sizeof(int)이 4 인 경우 int는 해당 시스템에서 64 비트를 가짐을 의미합니다.