내 컴퓨터에서 다음 프로그램은 1234를 출력합니다.문자열 리터럴의 endianness 및 case 문에서 문자열 사용
const char str[] = "1234";
printf("%c%c%c%c\n",
(int) (0xff & (*(uint32_t*) str) >> 0),
(int) (0xff & (*(uint32_t*) str) >> 8),
(int) (0xff & (*(uint32_t*) str) >> 16),
(int) (0xff & (*(uint32_t*) str) >> 24));
이 str
내부적 0x34333231
로 표현되는 것을 의미하고, 제 1 바이트 str[0]
최하위 8 개 비트를 나타낸다.
str
은 리틀 엔디안으로 인코딩됩니까? 그리고이 프로그램의 출력은 플랫폼에 따라 다릅니 까?
또한 switch case 문에 1, 2, 4 및 8 자의 문자열 리터럴을 사용하는 편리한 방법이 있습니까? *(const uint32_t* const) "1234"
은 상수 표현식이 아니며 0x34333231
/0x31323334
은 16 진수로 표기해야하며 플랫폼에 종속적 일 수 있으므로 문자열을 정수로 변환 할 수있는 방법이 없습니다.
편집 : 즉
은 str[0]
항상 동일한 0xff & *(uint32_t*) str
입니까?
어, 결코 생각하지 말고 그냥 깨달았습니다. 이유도 있습니다.
감사합니다. 그러나 8 문자 리터럴은 어떨까요? 그것은 내 컴퓨터의 워드 크기이지만 int의 크기보다 큽니다. – RPFeltz
@RPFeltz 컴파일러에 확장 기능이있는 경우에만. 표준에 따라 문자 리터럴은 항상 int입니다. –