float มีขนาด 4 ไบต์ ซึ่งเท่ากับ int ซึ่งเป็น 32 บิต
บิตแรกแทนเครื่องหมาย 0 แทนจำนวนบวก และ 1 แทนจำนวนลบ นี่เป็นเรื่องง่ายที่จะเข้าใจ ดังนั้นอย่ากังวลไป
บิตที่ 2 ถึง 9 แทนเลขชี้กำลัง รวมเป็น 8 บิต (สามารถแทน 0-255 ได้) ฐานในที่นี้คือ 2 ในการแทนจำนวนบวกและลบ จะต้องลบออฟเซ็ต 127 ที่นี่ ในกรณีนี้ ช่วงคือ (-127 ถึง 128) นอกจากนี้ 0 ทั้งหมดและ 1 ทั้งหมดจะถือเป็นการประมวลผลพิเศษ ดังนั้น -126 ถึง 127 จะแสดงโดยตรง
23 บิตที่เหลือแสดงถึงส่วนทศนิยม โดยที่ 23 บิตแทนตัวเลข 24 บิต เนื่องจากมีค่าเริ่มต้นนำหน้า 1 (เฉพาะไบนารี่เท่านั้นที่มีคุณลักษณะนี้)
ผลลัพธ์สุดท้ายคือ: (-1)^(เครื่องหมาย) * 1 f * 2^(เลขชี้กำลัง)
ที่นี่: เครื่องหมายคือบิตเครื่องหมาย f เป็นส่วนทศนิยมของ 23 บิต เลขชี้กำลังเป็นส่วนเลขชี้กำลัง และช่วงสุดท้ายคือ (เนื่องจากตัวเลขบวกและลบมีความสมมาตร เราจึงสนใจเฉพาะตัวเลขบวกเท่านั้น)
2^(-126) ~~ 2(1-2^(-24)) * 2^127
นี่ไม่ใช่ช่วงค่าของจำนวนทศนิยม เนื่องจากมาตรฐานยังกำหนดการแสดงค่าแบบดีนอร์มัลไลซ์ด้วย และมีข้อบังคับพิเศษบางประการ
การเป็นตัวแทนแบบดีนอร์มัลไลซ์:
เมื่อส่วนเลขชี้กำลังเป็น 0 ทั้งหมด และส่วนทศนิยมไม่ใช่ 0 ทั้งหมด มันจะแทนจำนวนจุดลอยตัวแบบดีนอร์มัลไลซ์ เนื่องจากค่าเริ่มต้นไม่มี 1 นำหน้า แต่เป็น 0
ค่าบิตคือ 0 f * 2^(-126) ระบุช่วงบิต 2^(-149)~~ (1-2^(-23)) * 2^(-126) เครื่องหมายนี้ไม่ได้รับการพิจารณาที่นี่ เหตุใดจึงเป็น -126 แทนที่จะเป็น -127 ถ้าเป็น -127 แสดงว่านิพจน์สูงสุดคือ
2^(-127)-2^(-149) เห็นได้ชัดว่า 2^(-127) ~~2^(-126) ไม่สามารถแสดงได้
สำนวนพิเศษอื่นๆ
1. เมื่อส่วนเลขชี้กำลังและส่วนทศนิยมเป็น 0 ทั้งหมด จะแสดงค่า 0 ซึ่งสามารถแบ่งออกเป็น +0 และ -0 (กำหนดโดยบิตเครื่องหมาย) 0x00000000 แทนค่าบวก 0 และ 0x80000000 แทนค่าลบ 0
2. เมื่อส่วนเลขชี้กำลังเป็น 1 ทั้งหมด และส่วนทศนิยมเป็น 0 ทั้งหมด จะหมายถึงอนันต์ รวมทั้งค่าอนันต์บวกและค่าอนันต์ลบด้วย 0x7f800000 หมายถึงค่าอนันต์บวก และ 0xff800000 หมายถึงค่าอนันต์ติดลบ
3. เมื่อส่วนเลขชี้กำลังเป็น 1 ทั้งหมด และส่วนทศนิยมไม่ใช่ 0 ทั้งหมด หมายความว่า NaN ซึ่งแบ่งออกเป็น QNaN และ SNaN ทั้งคู่เป็น NaN ในภาษา Java
สรุปแล้ว:
จะเห็นได้ว่าช่วงค่าของเลขทศนิยมคือ 2^(-149)~~(2-2^(-23))*2^127 ซึ่งก็คือ Float MIN_VALUE และลอยตัว MAX_VALUE
PS: ลอยเป็นเลขฐานสิบหก, เลขฐานสิบหกจะลอย
package com.sondon.dev_soceket.test; /** * @Project: การสื่อสารด้วยฮาร์ดแวร์* @Package: com.sondon.tcpip * @Class: Test.java * @Company Guangzhou Xundong Network Technology Co., Ltd.* @ผู้เขียน: Cai Wenfeng* @DateTime: 2 เมษายน 2558 11:21:53 น. * @Blog: http://blog.csdn.net/caiwenfeng_for_23 * @Description: {Test} */ การทดสอบคลาสสาธารณะ { public static void main(String[] args) { String s="3E1E9E9F"; intBitsToFloat(จำนวนเต็ม(s.trim(), 16)); System.out.println(ค่า); f=0.15490197f; System.out.println(Integer.toHexString(Float.floatToIntBits(f)));