คำถามติดแท็ก bit-fields

20
ปลอดภัยไหมที่จะใช้ -1 เพื่อตั้งค่าบิตทั้งหมดให้เป็นจริง
ฉันเคยเห็นรูปแบบนี้ใช้มากใน C & C ++ unsigned int flags = -1; // all bits are true นี่เป็นวิธีพกพาที่ดีในการทำสิ่งนี้หรือไม่? หรือใช้อยู่0xffffffffหรือ~0ดีกว่า?
134 c++  c  binary  bit-fields 

6
เหตุใดการกำหนดค่าให้กับฟิลด์บิตจึงไม่ให้ค่าเดิมกลับคืนมา
ฉันเห็นรหัสด้านล่างในโพสต์ Quora นี้ : #include <stdio.h> struct mystruct { int enabled:1; }; int main() { struct mystruct s; s.enabled = 1; if(s.enabled == 1) printf("Is enabled\n"); // --> we think this to be printed else printf("Is disabled !!\n"); } ในทั้งสอง C & C ++ ผลลัพธ์ของโค้ดที่เป็นที่ไม่คาดคิด , ถูกปิดใช้งาน !! แม้ว่าจะมีการให้คำอธิบายที่เกี่ยวข้องกับ "บิตเครื่องหมาย" …

3
การตัดทอนเลขจำนวนเต็มบิทฟิลด์ที่ไม่ได้ลงนามระหว่าง C ++ และ C ที่ไม่สอดคล้องกันในคอมไพเลอร์ต่างกัน
แก้ไข 2 : ฉันแก้ไขข้อผิดพลาดในการทดสอบที่ผิดปกติเมื่อฟังก์ชั่นก่อนหน้านี้อาศัยอยู่ในไฟล์ต้นฉบับ C ++ แต่ย้ายไปเป็นคำต่อคำของไฟล์ C เริ่มส่งคืนผลลัพธ์ที่ไม่ถูกต้อง MVE ด้านล่างอนุญาตให้สร้างปัญหาขึ้นอีกครั้งด้วย GCC อย่างไรก็ตามเมื่อฉันตั้งใจรวบรวมตัวอย่างกับ Clang (และต่อมากับ VS) ฉันได้ผลลัพธ์ที่ต่างออกไป! ฉันไม่สามารถคิดได้ว่าจะจัดการสิ่งนี้เป็นข้อบกพร่องในคอมไพเลอร์ตัวใดตัวหนึ่งหรือเป็นการรวมตัวของผลลัพธ์ที่ไม่ได้กำหนดซึ่งอนุญาตโดยมาตรฐาน C หรือ C ++ แปลกไม่มีคอมไพเลอร์ให้คำเตือนใด ๆ เกี่ยวกับการแสดงออก ผู้ร้ายคือการแสดงออกนี้: ctl.b.p52 << 12; ที่นี่p52พิมพ์เป็นuint64_t; มันยังเป็นส่วนหนึ่งของสหภาพ (ดูcontrol_tด้านล่าง) การดำเนินการกะจะไม่สูญเสียข้อมูลใด ๆ เนื่องจากผลลัพธ์ยังพอดีกับ 64 บิต อย่างไรก็ตาม GCC ตัดสินใจตัดทอนผลลัพธ์เป็น 52 บิตหากฉันใช้คอมไพเลอร์ C ! ด้วยคอมไพเลอร์ C ++ ผลลัพธ์ 64 บิตทั้งหมดจะถูกเก็บไว้ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.