답변:
다중 문자 리터럴입니다. 1952805748
는 0x74657374
로 분해됩니다
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
편집하다:
C ++ 표준, §2.14.3 / 1-문자 리터럴
(...) 둘 이상의 c-char를 포함하는 일반 문자 리터럴은 다중 문자 리터럴입니다. 다중 문자 리터럴은 int 유형과 구현 정의 값을 갖습니다.
sizeof(int)
구현도 정의되어 있다고 가정합니다 . 따라서 스토리지 주문 구현이 정의 될뿐만 아니라 이들의 최대 길이도 정의됩니다.
아니요, 주소가 아닙니다. 소위 멀티 바이트 문자입니다.
일반적으로 4 문자의 ASCII 값이 결합되어 있습니다.
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
따라서 0x74657374는 1952805748입니다.
그러나 다른 컴파일러에서는 0x74736574가 될 수도 있습니다. C 및 C ++ 표준은 모두 멀티 바이트 문자의 값이 구현 정의되어 있다고 말합니다 . 따라서 일반적으로 사용을 권장 하지 않습니다.
int
대부분의 컴퓨터에서 4 바이트이므로 4 바이트 이상을 사용하는 것이 의미가 없다고 생각합니다. 그렇습니다. 일정한 상수를 작성하는 편리한 방법이되었지만 불행히도 다른 컴파일러가 다르게 해석하여 요즘 대부분의 코딩 스타일은 사용을 권장하지 않습니다.
==
확인해야 하므로 스위치와 기타에서 안전하게 사용할 수 있습니다.
둘 이상의 c 문자를 포함하는 일반 문자 리터럴은 다중 문자 리터럴입니다. 다중 문자 리터럴은 int 유형과 구현 정의 값을 갖습니다.
구현 정의 동작은 구현에서 문서화해야합니다. 예를 들어 gcc에서는 여기에서 찾을 수 있습니다.
컴파일러는 한 번에 한 문자 씩 여러 문자 문자 상수를 계산하여 대상 문자 당 비트 수만큼 왼쪽으로 이전 값을 이동 한 다음 새 문자의 비트 패턴에서 대상 너비로 잘립니다 캐릭터. 최종 비트 패턴에는 int 유형이 지정되므로 단일 문자의 서명 여부에 관계없이 서명됩니다.
자세한 내용 은 이 페이지 의 설명을 확인 하십시오.
그들은 정말로 int
s입니다. 예를 들어 CoreAudioTypes.h
헤더 파일 에서 Core Audio API 열거 형에 광범위하게 사용 됩니다.
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
"플랫폼 독립형"이 아니라 특정 플랫폼 용 으로 만들어진 API를 사용할 때 이식성에 관심이있는 것에 대해 많은 대화가 있습니다 . 동일한 플랫폼에서 평등을 확인하는 것은 결코 실패하지 않습니다. 이 enum
'd 값은 더 읽기 쉽고 실제로 가치에 자신의 정체성 이 포함되어 있습니다 .
아래에서 시도한 것은 멀티 바이트 문자 리터럴을 감싸서 인쇄 할 수 있도록하는 것입니다 (Mac에서는 작동합니다). 이상한 점은 4자를 모두 사용하지 않으면 결과가 잘못됩니다.
#include <stdio.h>
#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))
struct Multibyte
{
union{
int val ;
char vals[4];
};
Multibyte() : val(0) { }
Multibyte( int in )
{
vals[0] = MASK(in,3);
vals[1] = MASK(in,2);
vals[2] = MASK(in,1);
vals[3] = MASK(in,0);
}
char operator[]( int i ) {
return val >> (3-i)*8 ; // works on mac
//return val>>i*8 ; // might work on other systems
}
void println()
{
for( int i = 0 ; i < 4 ; i++ )
putc( vals[i], stdout ) ;
puts( "" ) ;
}
} ;
int main(int argc, const char * argv[])
{
Multibyte( 'abcd' ).println() ;
Multibyte( 'x097' ).println() ;
Multibyte( '\"\\\'\'' ).println() ;
Multibyte( '/*|' ).println() ;
Multibyte( 'd' ).println() ;
return 0;
}