คำถามติดแท็ก casting

การคัดเลือกนักแสดงเป็นกระบวนการที่ประเภทวัตถุจะถูกแปลงเป็นประเภทอื่นอย่างชัดเจนหากได้รับอนุญาตให้ทำการแปลง กระบวนการนี้อาจนำไปสู่การเปลี่ยนแปลงมูลค่า

10
การแปลงตัวชี้เป็นจำนวนเต็ม
ฉันกำลังพยายามปรับรหัสที่มีอยู่ให้เป็นเครื่อง 64 บิต ปัญหาหลักคือในฟังก์ชันหนึ่ง coder ก่อนหน้านี้ใช้อาร์กิวเมนต์ void * ที่ถูกแปลงเป็นประเภทที่เหมาะสมในฟังก์ชันนั้นเอง ตัวอย่างสั้น ๆ : void function(MESSAGE_ID id, void* param) { if(id == FOO) { int real_param = (int)param; // ... } } แน่นอนในเครื่อง 64 บิตฉันได้รับข้อผิดพลาด: error: cast from 'void*' to 'int' loses precision ฉันต้องการแก้ไขสิ่งนี้เพื่อให้มันยังคงทำงานบนเครื่อง 32 บิตและสมบูรณ์ที่สุด ความคิดใด ๆ ?
88 c++  gcc  casting  64-bit  32-bit 

2
เหตุใด C และ C ++ จึงอนุญาตให้ใช้นิพจน์ (int) + 4 * 5
(int) + 4*5; นี่คือเหตุผลที่(การเพิ่มชนิดที่มีค่า)ไปได้หรือไม่ (ลองใช้ g ++ และ gcc.) ฉันรู้ว่ามันไม่สมเหตุสมผล (และไม่มีผล) แต่ฉันอยากรู้ว่าทำไมถึงเป็นไปได้

3
การร่ายสองครั้งไปยัง int ที่ไม่ได้ลงนามบน Win32 ถูกตัดทอนเป็น 2,147,483,648
รวบรวมรหัสต่อไปนี้: double getDouble() { double value = 2147483649.0; return value; } int main() { printf("INT_MAX: %u\n", INT_MAX); printf("UINT_MAX: %u\n", UINT_MAX); printf("Double value: %f\n", getDouble()); printf("Direct cast value: %u\n", (unsigned int) getDouble()); double d = getDouble(); printf("Indirect cast value: %u\n", (unsigned int) d); return 0; } เอาต์พุต (MSVC x86): INT_MAX: 2147483647 …

13
java: ฉันจะทำการแคสต์ตัวแปรแบบไดนามิกจากประเภทหนึ่งไปยังอีกประเภทหนึ่งได้อย่างไร
ฉันต้องการทำการแคสต์แบบไดนามิกสำหรับตัวแปร Java ประเภทการหล่อจะถูกเก็บไว้ในตัวแปรอื่น นี่คือการคัดเลือกนักแสดงปกติ: String a = (String) 5; นี่คือสิ่งที่ฉันต้องการ: String theType = 'String'; String a = (theType) 5; เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นได้อย่างไร ขอบคุณ! อัปเดต ฉันกำลังพยายามเติมข้อมูลในชั้นเรียนด้วยHashMapที่ฉันได้รับ นี่คือตัวสร้าง: public ConnectParams(HashMap<String,Object> obj) { for (Map.Entry<String, Object> entry : obj.entrySet()) { try { Field f = this.getClass().getField(entry.getKey()); f.set(this, entry.getValue()); /* <= CASTING PROBLEM */ } catch …

1
ผู้ดำเนินการแคสต์สามารถเปิดเผยได้หรือไม่?
เมื่อพูดถึงคอนสตรัคเตอร์การเพิ่มคีย์เวิร์ดexplicitจะป้องกันไม่ให้คอมไพเลอร์ที่กระตือรือร้นสร้างอ็อบเจกต์เมื่อมันไม่ใช่ความตั้งใจแรกของโปรแกรมเมอร์ กลไกดังกล่าวมีให้สำหรับผู้ประกอบการหล่อด้วยหรือไม่? struct Foo { operator std::string() const; }; ตัวอย่างเช่นที่นี่ฉันอยากจะร่ายFooเป็น a std::stringได้ แต่ฉันไม่ต้องการให้นักแสดงดังกล่าวเกิดขึ้นโดยปริยาย

3
ทำไมมูลค่าส่งคืนฟรีของนักแสดงจึงเป็นโมฆะ?
ฉันกำลังอ่านหนังสือ ( การเขียนโปรแกรมด้วย POSIX Threadsโดย Butenhof, 1997) ที่ใช้ C และฉันเจอบรรทัดต่อไปนี้: (void)free(data); นี่dataเป็นเพียงตัวชี้ไปยังโครงสร้างที่ปันส่วน data = malloc(sizeof(my_struct_t)); ทำไมเป็นผลมาจากfreeการถูกโยนไปvoid? จากความเข้าใจของฉันเกี่ยวกับ C สิ่งนี้ดูเหมือนจะไม่สมเหตุสมผลด้วยสองเหตุผล: ฟังก์ชันฟรีส่งคืนแล้ว void รหัสไม่ได้ใช้ค่าส่งคืน (มันไม่ได้ถูกกำหนดให้กับตัวแปร) หนังสือเล่มนี้เขียนขึ้นในปี 1997 นี่เป็นเรื่องของมรดกหรือเปล่า ผู้เขียนกล่าวว่าตัวอย่างทำงานบน Digital Unix 4.0d แต่ฉันก็ยังนึกภาพไม่ออกว่ามีเหตุผลอะไรที่จะส่งผลของฟังก์ชั่นหากคุณไม่ได้ใช้ผลลัพธ์นั้น
82 c  casting  free  void  legacy-code 

3
ทำไม javac จึงอนุญาตให้ใช้งานได้
ถ้าฉันพยายามที่จะส่ง a Stringถึงjava.util.Date, คอมไพเลอร์ Java จับข้อผิดพลาด ดังนั้นทำไมคอมไพเลอร์ไม่ตั้งค่าสถานะต่อไปนี้เป็นข้อผิดพลาด? List<String> strList = new ArrayList<>(); Date d = (Date) strList; แน่นอน JVM โยนClassCastExceptionat runtime แต่คอมไพเลอร์ไม่ได้ตั้งค่าสถานะ พฤติกรรมนี้เหมือนกันกับ javac 1.8.0_212 และ 11.0.2

6
เหตุใดจึงมีการอ้างสิทธิ์การยกเลิกการลงทะเบียนประเภทตัวชี้คำเตือนเฉพาะคอมไพเลอร์?
ฉันได้อ่านโพสต์ต่างๆ ในStack Overflow RE: ข้อผิดพลาดพอยน์เตอร์ที่พิมพ์ผิดประเภท ความเข้าใจของฉันคือข้อผิดพลาดโดยพื้นฐานแล้วคำเตือนของคอมไพเลอร์เกี่ยวกับอันตรายของการเข้าถึงวัตถุผ่านตัวชี้ประเภทอื่น (แม้ว่าจะมีข้อยกเว้นเกิดขึ้น) ซึ่งเป็นคำเตือนที่เข้าใจได้และสมเหตุสมผล char* คำถามของฉันเฉพาะรหัสด้านล่าง: เหตุใดการกำหนดที่อยู่ของตัวชี้ให้มีvoid**คุณสมบัติสำหรับคำเตือนนี้ (เลื่อนเป็นข้อผิดพลาดผ่าน-Werror) ยิ่งไปกว่านั้นโค้ดนี้ได้รับการรวบรวมสำหรับสถาปัตยกรรมเป้าหมายหลาย ๆ อันซึ่งหนึ่งในนั้นเท่านั้นที่สร้างคำเตือน / ข้อผิดพลาด - นี่อาจหมายถึงว่ามันเป็นข้อบกพร่องเฉพาะรุ่นคอมไพเลอร์อย่างถูกกฎหมายหรือไม่ // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = …
38 c  pointers  casting 

6
วิธีที่ถูกต้องในการแปลง 2 ไบต์เป็นจำนวนเต็ม 16 บิตที่ลงนามคืออะไร?
ในคำตอบนี้ , zwolทำให้การเรียกร้องนี้: วิธีที่ถูกต้องในการแปลงข้อมูลสองไบต์จากแหล่งข้อมูลภายนอกให้เป็นจำนวนเต็ม 16 บิตที่มีลายเซ็นคือฟังก์ชันผู้ช่วยเช่นนี้ #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) val) - 0x10000u; } int16_t le16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 0) | (((uint32_t)data[1]) << 8); return ((int32_t) val) - …

1
เหตุใดใน C ++ static_cast <unsigned> ของจำนวนลบจึงแตกต่างกันถ้าจำนวนนั้นเป็นค่าคงที่หรือไม่
กฎ C ++ ที่มีความหมายเท่าเทียมกันคือเท็จ ? ได้รับ: float f {-1.0}; bool equal = (static_cast&lt;unsigned&gt;(f) == static_cast&lt;unsigned&gt;(-1.0)); เช่นhttps://godbolt.org/z/fcmx2P #include &lt;iostream&gt; int main() { float f {-1.0}; const float cf {-1.0}; std::cout &lt;&lt; std::hex; std::cout &lt;&lt; " f" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(f) &lt;&lt; '\n'; std::cout &lt;&lt; "cf" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(cf) &lt;&lt; '\n'; …
28 c++  casting 

2
กำลังส่งการอ้างอิงฟังก์ชันที่สร้างตัวชี้ที่ไม่ถูกต้อง
ฉันกำลังติดตามข้อผิดพลาดในรหัสบุคคลที่สามและฉัน จำกัด ให้แคบลงเหลือบางอย่างตามลำดับ use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &amp;foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } วิ่งบนเสถียร 1.38.0 นี้จะพิมพ์ตัวชี้ฟังก์ชั่น แต่เบต้า (1.39.0-beta.6) และส่งคืน '1' ทุกคืน ( สนามเด็กเล่น ) _การอนุมานคืออะไรและทำไมพฤติกรรมจึงเปลี่ยนไป ฉันถือว่าวิธีที่ถูกต้องในการส่งแบบนี้จะเป็นไปได้foo as *const c_voidแต่นี่ไม่ใช่รหัสของฉัน

1
การส่งแบบสแตติกประเภทโดยนัย (การบีบบังคับ) ใน Haskell
ปัญหา พิจารณาปัญหาการออกแบบต่อไปนี้ใน Haskell ฉันมีความเรียบง่าย, EDSL สัญลักษณ์ที่ฉันต้องการที่จะแสดงตัวแปรและการแสดงออกทั่วไป (มีหลายชื่อหลายตัวแปร) x^2 * y + 2*z + 1เช่น นอกจากนี้ผมต้องการที่จะแสดงสมสัญลักษณ์บางกว่าการแสดงออกการพูดx^2 + 1 = 1เช่นเดียวกับคำนิยามx := 2*y - 2เช่น เป้าหมายคือ: มีประเภทที่แยกต่างหากสำหรับตัวแปรและนิพจน์ทั่วไป - ฟังก์ชันบางอย่างอาจนำไปใช้กับตัวแปรและไม่ใช่นิพจน์ที่ซับซ้อน ตัวอย่างเช่นตัวดำเนินการคำนิยาม:=อาจเป็นประเภท (:=) :: Variable -&gt; Expression -&gt; Definitionและไม่ควรส่งผ่านนิพจน์ที่ซับซ้อนเป็นพารามิเตอร์ด้านซ้ายมือ (แม้ว่ามันจะเป็นไปได้ที่จะส่งตัวแปรเป็นพารามิเตอร์ด้านขวาโดยไม่ต้องมีการแคสต์อย่างชัดเจน ) . มีตัวอย่างของนิพจน์Numเพื่อให้สามารถส่งเสริมตัวอักษรจำนวนเต็มเป็นนิพจน์และใช้สัญลักษณ์ที่สะดวกสำหรับการดำเนินการเกี่ยวกับพีชคณิตทั่วไปเช่นการบวกหรือการคูณโดยไม่ต้องแนะนำตัวดำเนินการ wrapper เสริม ในคำอื่น ๆ ผมอยากจะมีนัยและคงประเภทหล่อ (บังคับ) ของตัวแปรที่จะแสดงออก ตอนนี้ฉันรู้แล้วว่าไม่มีการปลดเปลื้องประเภทใน Haskell อย่างไรก็ตามแนวคิดการเขียนโปรแกรมเชิงวัตถุบางอย่าง (การสืบทอดง่าย …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.