2011-05-10 7 views
1

종료 문자와 관련하여이 둘 사이에 캐스팅을하면 어떻게됩니까? C99 Objective-C에서.uint8_t *와 char * 사이에 캐스팅. 무슨 일이야?

+1

부동 소수점을 정수로 또는 그 반대로 캐스팅하지 않는 한 캐스트가 수행하는 유일한 작업은 컴파일러 경고를 없애는 것입니다. 출력 코드는 정확히 같습니다. – ughoavgfhw

+0

사실이 아닙니다. C 언어 *는 다른 포인터 타입 사이의 암시 적 변환을 정의하지 않습니다 (물론'void *'제외). 캐스트는 변환 할 수있는 유일한 방법입니다. 캐스트없이 변환을 허용하고 경고 만 생성하는 컴파일러는 잘못된 "관대 한"것입니다. 그것은 정확하지 않습니다. –

답변

4

이 대답에서 char은 시스템의 8 비트라고 가정합니다.

unsigned charchar 유형으로 사용하는 경우 절대적으로 아무 것도 발생하지 않습니다.

아키텍처에 char 형식으로 signed char을 사용하는 경우 음수의 char 값이 줄 바꿈되어 예기치 않은 결과가 발생할 수 있습니다. 그러나 종료 null 문자는 절대로 발생하지 않습니다. "캐스팅"아무것도에 의해


유의하시기 바랍니다 정말 그냥 다른 메모리에 특정 위치를 해석하는 컴파일러에게, 발생합니다. 이러한 해석의 차이는 출연진의 실제 (부작용) 효과를 창출 할 것이다.

+0

고맙습니다. 그러나 일부 유형이 특별히 변환되었다고 생각했습니다. 예를 들어 float를 int로 지정합니다. 그것은 회심해야합니다. 그러나 포인터를 위해 어떤 캐스트로도 데이터에 아무 일도 일어나지 않습니까? –

+0

float를 int 값으로 캐스팅하면 copy 값이 변환됩니다. 부동 소수점에 대한 포인터를 캐스팅하면 부동 소수점에 이상한 값이 남을 것입니다. nothign이 변경됩니다. –

+0

물론입니다. 예외가 있는지 몰랐습니다. 나는 uint8_t와 char에 관한 잘못된 것을 말하고있는 어딘가의 웹 사이트를 발견했다. 그래서 나는 여기에 와야 만했다. –

0

char 및와 호환되는 유형 (가장 최신 데스크탑 컴퓨터에 있어야 함) 인 경우 해당 유형의 객체에 대한 포인터는 동일한 표현 및 정렬 요구 사항을 갖기 때문에 변환에 아무런 문제가 없어야합니다 (암시 적으로 또는 캐스트).

호환되는 경우 다시 지정된 값은 해석되는 유형에 관계없이 동일하게 처리해야합니다.

참고 : uint8_tchar은 서명 된 문자로 구현할 때 100 % 호환되지 않습니다.

유형은 당신이 정의되지 않은 동작을 호출하고 아무것도 일어날 수있는 호환되지 않는 경우 발생할 수있는 가능성이 매우 높다 일이 예상대로 모든 것이 "작품"이다 - 을하지만 보장은 항상 같은를 작동 없다

+0

호환성에 관계없이 UB를 호출하지 않았습니다. ** 모든 타입 **은'unsigned char [sizeof (type)]'의 오버레이 배열로 접근 할 수 있습니다. –

+0

흠 ... 물론! 나는 단지'uint8_t'를'char'와 호환되지 않는 것으로 보았지만'uint8_t'가 상상할 수 없으며'char'와 호환되지 않습니다. – pmg

+1

''char''가 unsigned가 아닌 이상 "compatible"이라고 생각하지 않습니다. 그것은'unsigned char'가 특별하고 무엇이든 접근 할 수 있다는 것입니다.사실, 기술적으로'uint8_t'는 앨리어싱 속성을 제외하고'unsigned char'와 같은 속성을 가진 "확장 된 정수 타입"이 될 수 있다고 가정합니다.이 경우 코드가 UB를 호출 할 수 있습니다 .... –

관련 문제