我对这段代码感到好奇:
cout << 'test'; // Note the single quotes.
Run Code Online (Sandbox Code Playgroud)
给我一个输出1952805748.
我的问题:输出是内存中的地址还是什么?
K-b*_*llo 283
这是一个多字符文字.1952805748是0x74657374,分解为
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
Run Code Online (Sandbox Code Playgroud)
编辑:
C++标准,§2.14.3/ 1 - 字符文字
(...)包含多个c-char的普通字符文字是多字符文字.多字符文字具有int类型和implementation-de fi ned值.
chy*_*hys 74
不,这不是地址.这就是所谓的多字节字符.
通常,它是组合的四个字符的ASCII值.
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
Run Code Online (Sandbox Code Playgroud)
所以0x74657374是1952805748.
但它在某些其他编译器上也可能是0x74736574.C和C++标准都说多字节字符的值是实现定义的.因此,强烈建议不要使用它.
bob*_*obo 10
他们真的只是int.它们被广泛用于Core Audio API枚举中,例如,在CoreAudioTypes.h头文件中,
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
Run Code Online (Sandbox Code Playgroud)
有很多关于这不是"平台独立"的喋喋不休,但是当你使用为特定平台制作的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;
}
Run Code Online (Sandbox Code Playgroud)