回答:
これは複数文字リテラルです。1952805748
is 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バイトより多く使用しても意味がないと思います。はい、それはいくつかの定数を書くための便利な方法であることが意図されていましたが、残念なことに、コンパイラが異なると解釈が異なるため、現在、ほとんどのコーディングスタイルはその使用を思いとどまらせています。
==
確認する必要があるため、スイッチなどで安全に使用できます
彼らは本当にただですint
。これらは、Core Audio API列挙型、たとえばCoreAudioTypes.h
ヘッダーファイルで広く使用されています。
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
これが「プラットフォームに依存しない」ことについては多くのおしゃべりがありますが、特定のプラットフォーム用に作成されたAPIを使用している場合は、移植性を重視します。同じプラットフォームで等しいかどうかのチェックは失敗しません。これらのenum
'd値は読みやすく、実際には値にIDが含まれています。これは非常に便利です。
以下で私が試したのは、マルチバイト文字リテラルをラップして印刷できるようにすることです(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;
}