การอ่านคำตอบสำหรับคำถามนี้ฉันเจอความคิดเห็นนี้ [แก้ไข]
2 ของ 0100 (4) จะเป็น 1100 ตอนนี้ 1100 คือ 12 ถ้าฉันพูดตามปกติ ดังนั้นเมื่อผมพูดปกติ 1100 มันก็คือ 12 แต่เมื่อผมพูดว่าส่วนเสริม 2 ของ 1100 แล้วมันคือ -4? นอกจากนี้ใน Java เมื่อ 1100 (ให้สมมติว่า 4 บิตในตอนนี้) จะถูกเก็บไว้แล้วจะถูกกำหนดอย่างไรถ้ามันเป็น +12 หรือ -4 - hagrawal 2 ก.ค. เวลา 16:53 น
ในความคิดของฉันคำถามที่ถามในความคิดเห็นนี้ค่อนข้างน่าสนใจและดังนั้นฉันต้องการก่อนอื่นให้เรียบเรียงใหม่แล้วให้คำตอบและตัวอย่าง
คำถาม - ระบบจะสร้างวิธีการตีความจำนวนหนึ่งไบต์ที่อยู่ติดกันได้อย่างไร โดยเฉพาะอย่างยิ่งระบบจะสร้างได้อย่างไรว่าลำดับที่กำหนดของไบต์เป็นเลขฐานสองธรรมดาหรือหมายเลขประกอบ 2
คำตอบ - ระบบกำหนดวิธีการตีความลำดับของไบต์ถึงประเภท ประเภทกำหนด
- จำนวนไบต์ที่ต้องพิจารณา
- วิธีตีความไบต์เหล่านั้น
ตัวอย่าง - ด้านล่างเราถือว่า
char
มีความยาว 1 ไบต์
short
มีความยาว 2 ไบต์
int
และfloat
มีความยาว 4 ไบต์
โปรดทราบว่าขนาดเหล่านี้เฉพาะกับระบบของฉัน แม้ว่าจะค่อนข้างธรรมดา แต่ก็สามารถแตกต่างกันไปตามระบบ หากคุณอยากรู้อยากเห็นในสิ่งที่พวกเขาอยู่ในระบบของคุณใช้ประกอบ sizeof
ครั้งแรกของทั้งหมดที่เรากำหนดอาร์เรย์มี 4 ไบต์และเริ่มต้นทั้งหมดของพวกเขาไปยังหมายเลขไบนารีที่สอดคล้องกับจำนวนฐานสิบหก10111101
BD
// BD(hexadecimal) = 10111101 (binary)
unsigned char l_Just4Bytes[ 4 ] = { 0xBD, 0xBD, 0xBD, 0xBD };
จากนั้นเราอ่านเนื้อหาอาเรย์โดยใช้ประเภทที่แตกต่างกัน
unsigned char
และ signed char
// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );
// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char -> %i\n", *( ( signed char* )l_Just4Bytes ) );
unsigned short
และ short
// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );
// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short -> %hi\n", *( ( short* )l_Just4Bytes ) );
unsigned int
, int
และfloat
// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int -> %i\n", *( ( int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float -> %f\n", *( ( float* )l_Just4Bytes ) );
4 ไบต์ใน RAM ( l_Just4Bytes[ 0..3 ]
) จะยังคงเหมือนเดิมทุกประการ สิ่งเดียวที่เปลี่ยนแปลงคือวิธีที่เราตีความพวกเขา
อีกครั้งที่เราบอกระบบว่าจะตีความพวกเขาผ่านประเภท
ตัวอย่างข้างต้นเราได้ใช้ประเภทต่อไปนี้เพื่อตีความเนื้อหาของl_Just4Bytes
อาร์เรย์
unsigned char
: 1 ไบต์ในไบนารีธรรมดา
signed char
: 1 ไบต์ในส่วนเสริม 2
unsigned short
: 2 ไบต์ในรูปแบบไบนารีธรรมดา
short
: 2 ไบต์ต่อส่วนที่ 2
unsigned int
: 4 ไบต์ในรูปแบบไบนารีธรรมดา
int
: 4 ไบต์ในส่วนเสริม 2
float
: 4 ไบต์ในรูปแบบความแม่นยำเดี่ยวของ IEEE 754
[แก้ไข] โพสต์นี้ได้รับการแก้ไขหลังจากความคิดเห็นโดยผู้ใช้ 4581301 ขอบคุณที่สละเวลาวางสายที่มีประโยชน์เหล่านี้!