ฉันอยากรู้เกี่ยวกับรหัสนี้:
cout << 'test'; // Note the single quotes.
1952805748
ให้ฉันเอาท์พุทของ
คำถามของฉัน: เอาท์พุทที่อยู่ในหน่วยความจำหรืออะไร?
ฉันอยากรู้เกี่ยวกับรหัสนี้:
cout << 'test'; // Note the single quotes.
1952805748
ให้ฉันเอาท์พุทของ
คำถามของฉัน: เอาท์พุทที่อยู่ในหน่วยความจำหรืออะไร?
คำตอบ:
มันเป็นตัวอักษรที่หลากหลาย 1952805748
คือ0x74657374
ซึ่งสลายตัวเป็น
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
แก้ไข:
มาตรฐาน C ++, §2.14.3 / 1 - ตัวอักษรตัวละคร
(... ) ตัวอักษรธรรมดาที่มีตัวอักษร c-char มากกว่าหนึ่งตัวเป็นตัวอักษรหลายตัว ตัวอักษรหลายตัวมีค่า int และการปรับใช้การพิมพ์
sizeof(int)
ก็คือการดำเนินการที่กำหนดไว้เช่นกัน ดังนั้นไม่เพียง แต่จะมีการกำหนดการใช้งานการจัดเก็บข้อมูลเท่านั้น แต่ความยาวสูงสุดของสิ่งเหล่านี้ก็เช่นกัน
ไม่มันไม่ใช่ที่อยู่ มันเป็นตัวละครมัลติไบต์ที่เรียกว่า
โดยทั่วไปแล้วมันคือค่า ASCII ของอักขระสี่ตัวที่รวมกัน
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
ดังนั้น 0x74657374 คือ 1952805748
แต่ก็อาจเป็น 0x74736574 ในคอมไพเลอร์อื่น ๆ ซีและ C ++ มาตรฐานทั้งสองบอกว่าคุ้มค่าของตัวอักษรสัญลักษณ์ที่มีการดำเนินงานที่กำหนดไว้ ดังนั้นโดยทั่วไปการใช้งานจึงไม่สนับสนุนอย่างยิ่ง
int
เป็น 4 ไบต์ในเครื่องส่วนใหญ่ฉันไม่คิดว่ามันสมเหตุสมผลที่จะใช้มากกว่า 4 ไบต์ ใช่มันตั้งใจที่จะเป็นวิธีที่สะดวกในการเขียนค่าคงที่บางส่วน แต่น่าเสียดายที่คอมไพเลอร์ที่แตกต่างกันได้ตีความมันแตกต่างกันไปดังนั้นรูปแบบการเข้ารหัสส่วนใหญ่ในปัจจุบันจึงไม่สนับสนุนการใช้งาน
==
ควรตรวจสอบ
ตัวอักษรตัวอักษรธรรมดาที่มีมากกว่าหนึ่ง c-char เป็นตัวอักษรหลายตัว ตัวอักษรหลายตัวมีค่า int และการปรับใช้การพิมพ์
พฤติกรรมที่กำหนดไว้ในการนำไปปฏิบัติจะต้องมีการบันทึกไว้ในการปฏิบัติ ตัวอย่างเช่นใน gcc คุณสามารถค้นหาได้ที่นี่
คอมไพเลอร์ให้ค่าอักขระหลายตัวคงที่อักขระหนึ่งครั้งเลื่อนค่าก่อนหน้านี้ทิ้งตามจำนวนบิตต่ออักขระเป้าหมายจากนั้นหรือ-ing ในรูปแบบบิตของอักขระใหม่ที่ถูกตัดให้เป็นความกว้างของเป้าหมาย ตัวละคร รูปแบบบิตสุดท้ายจะได้รับประเภท int และดังนั้นจึงมีการลงนามโดยไม่คำนึงว่าตัวอักษรเดียวมีการลงนามหรือไม่
ตรวจสอบคำอธิบายในหน้านี้สำหรับรายละเอียดเพิ่มเติม
พวกมันแค่int
s จริงๆ พวกมันถูกใช้อย่างกว้างขวางใน Core Audio API enum's เช่นในCoreAudioTypes.h
ไฟล์ส่วนหัว
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
มีเรื่องไร้สาระมากมายเกี่ยวกับเรื่องนี้ไม่ได้เป็น "แพลตฟอร์มอิสระ" แต่เมื่อคุณใช้ API ที่ทำขึ้นสำหรับแพลตฟอร์มเฉพาะใครสนใจเรื่องการพกพา การตรวจสอบความเท่าเทียมกันบนแพลตฟอร์มเดียวกันจะไม่ล้มเหลว ค่าเหล่านี้enum
ง่ายต่อการอ่านและจริง ๆ แล้วพวกเขามีตัวตนของพวกเขาในค่าของพวกเขาซึ่งเป็นสิ่งที่ดีงาม
สิ่งที่ฉันพยายามทำด้านล่างคือห่ออักขระหลายไบต์ตามตัวอักษรขึ้นมาเพื่อให้สามารถพิมพ์ได้ (บน 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);
รหัสนี้มีแนวโน้มที่จะทำงานได้กับ endianess ที่เฉพาะเจาะจงและอาจแตกต่างจากคอมไพเลอร์ที่แตกต่างกัน