我对这段代码很好奇:
cout << 'test'; // Note the single quotes.
给我一个1952805748的输出。
1952805748
我的问题是:输出是内存中的地址还是什么?
它是一个多字符的文字。1952805748是0x74657374,它分解为
0x74657374
0x74 -> 't' 0x65 -> 'e' 0x73 -> 's' 0x74 -> 't'
编辑:
c++标准,§2.14.3/1 -字符字面值 < p >(…)包含多个字符的普通字符字面量 一个c-char是一个多字符字面值。多字符字面值具有类型int和实现定义 价值。< / p >
c++标准,§2.14.3/1 -字符字面值
不,这不是地址。这就是所谓的多字节字符。
通常,它是四个字符的ASCII值的组合。
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
所以0x74657374等于1952805748。
但是在其他编译器上它也可以是0x74736574。C和c++标准都规定多字节字符的值为实现定义。所以通常不鼓励使用强烈。
包含多个c-char的普通字符字面量是多字符字面量。多字符文字具有类型int和实现定义的值。
实现定义的行为需要由 实现。例如,在gcc中,你可以找到在这里
查看这个页面中的解释了解更多细节
它们实际上只是__abc。它们在Core Audio API枚举中被广泛使用,例如,在CoreAudioTypes.h头文件中,
CoreAudioTypes.h
enum { kAudioFormatLinearPCM = 'lpcm', kAudioFormatAC3 = 'ac-3', kAudioFormat60958AC3 = 'cac3', kAudioFormatAppleIMA4 = 'ima4', kAudioFormatMPEG4AAC = 'aac ', kAudioFormatMPEG4CELP = 'celp', } ;
有很多关于这不是“平台独立”的讨论,但当你使用一个特定平台的为 api时,谁会关心可移植性。在同一个平台上检查是否相等永远不会失败。这些__abc0d值更容易阅读,它们实际上包含他们在价值上的同一性,这非常好。
我在下面尝试做的是将一个多字节字符文字包装起来,这样它就可以打印(在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; }
byte* buffer = ...; if(*(int*)buffer == 'GET ') invoke_get_method(buffer+4);
这段代码可能只适用于特定的字节数,并且可能在不同的编译器之间中断