我对这段代码感到好奇:
cout << 'test'; // Note the single quotes.
给我输出1952805748
。
我的问题:输出是内存中的地址还是什么?
答案 0 :(得分:282)
这是一个多字符文字。 1952805748
为0x74657374
,其分解为
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
修改强>
C ++标准,§2.14.3/ 1 - 字符文字
(...)包含多个的普通字符文字 一个c-char是一个多字符文字。多字符文字具有int类型和实现定义 值。
答案 1 :(得分:73)
不,这不是地址。这就是所谓的多字节角色。
通常,它是四个字符组合的ASCII值。
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
所以0x74657374是1952805748。
但在某些其他编译器上它也可能是0x74736574。 C和C ++标准都说多字节字符的值是实现定义。因此,一般来说,强烈不鼓励使用它。
答案 2 :(得分:17)
包含多个c-char的普通字符文字是多字符文字。多字符文字具有int类型和实现定义值。
需要记录实现定义的行为 实施。例如,在gcc中,您可以找到它here
编译器指定多字符字符常量 一次一个角色,左移前一个值 通过每个目标字符的位数,然后 或者截取新字符的位模式 到目标角色的宽度。决赛 bit-pattern的类型为int,因此被签名, 无论单个字符是否已签名或 不。
查看this page中的说明了解详情
答案 3 :(得分:10)
他们真的只是int
。它们在Core Audio API枚举中被广泛使用,例如,在CoreAudioTypes.h
头文件中,
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;
}
答案 4 :(得分:1)
当您构建解析器时,这种功能非常好。 考虑一下:
byte* buffer = ...;
if(*(int*)buffer == 'GET ')
invoke_get_method(buffer+4);
此代码可能仅适用于特定的字节序,可能会破坏不同的编译器