tft每日頭條

 > 科技

 > 輸出浮點數絕對值的代碼

輸出浮點數絕對值的代碼

科技 更新时间:2024-08-23 23:44:53

輸出浮點數絕對值的代碼?我們知道,計算機的都是用二進制的開關電路實現的整數、浮點數、字符串在計算機中的實現都有相應的編碼方案,如補碼、IEEE574的浮點數表示法、ASCII字符編碼方案(用整數表來編碼字符),今天小編就來聊一聊關于輸出浮點數絕對值的代碼?接下來我們就一起去研究一下吧!

輸出浮點數絕對值的代碼(C代碼實現整數補碼和浮點數)1

輸出浮點數絕對值的代碼

我們知道,計算機的都是用二進制的開關電路實現的。整數、浮點數、字符串在計算機中的實現都有相應的編碼方案,如補碼、IEEE574的浮點數表示法、ASCII字符編碼方案(用整數表來編碼字符)。

1 補碼及二進制輸出

負數如何用補碼表示?

先表示為自然碼(原碼)。

将自然碼的每一位取反碼。

在最低位加“1”。

如4個位的補碼方案可以表示的數據範圍:

補碼輸出二進制位的代碼:

利用移位運算、與運算取最位的方法可以輸出補碼的每一個二進制位。

#include <iostream> using namespace std; void main() { while(1) { int n; cin>>n;//最好有邊界檢查 int h=1; h=h<<31;//32位,最高位1,其它位是0 for(int i=1;i<=32;i ) { if((n&h)==0) cout<<0; else cout<<1; n=n<<1; //左移一位,右位補0 if(i%4==0) cout<<" "; } cout<<endl; } system("pause"); } /* 43 0000 0000 0000 0000 0000 0000 0010 1011 -43 1111 1111 1111 1111 1111 1111 1101 0101 */

2 浮點數的IEEE574表示法

現代計算機中,一般都以IEEE 754标準存儲浮點數,這個标準的在内存中存儲的形式為:

對于不同長度的浮點數,階碼與小數位分配的數量不一樣,如對于32位的單精度浮點數,數符分配是1位,階碼分配了8位,尾數分配了是23位:

符号位:0表示正;1表示負;

偏移階碼e:e=指數的實際值 127。

如有一個浮點數10110010.001,則指數是7,階碼就要用7 127的二進制數表示,也就是:111 01111111 = 10000110 =134

尾數使用原碼表示,絕對值在1與2之間,其中1和小數點都是隐含的,并不直接表示。

上面浮點數的尾數就是0110010001

根據這個标準,我們來嘗試把一個十進制的浮點數轉換為IEEE754标準表示。

例如:178.125

先把浮點數分别把整數部分和小數部分轉換成2進制:

整數部分用除2取餘的方法,求得:10110010

小數部分用乘2取整的方法,求得:001

合起來即是:10110010.001

轉換成二進制的浮點數,即把小數點移動到整數位隻有1,即為:1.0110010001 * 2^111,111是二進制,由于左移了7位,所以是111

把浮點數轉換二進制後,這裡基本已經可以得出對應3部分的值了:

數符:由于浮點數是正數,故為0(負數為1)。

階碼 : 階碼的計算公式:階數 偏移量, 階碼是需要作移碼運算,在轉換出來的二進制數裡,階數是111(十進制為7),對于單精度的浮點數,偏移值為01111111(127)[偏移量的計算是:2^(e-1)-1, e為階碼的位數,即為8,因此偏移值是127],即:111 01111111 = 10000110=134(10進制)

尾數:小數點後面的數,即0110010001

最終根據位置填到對位的位置上:

可能有個疑問:小數點前面的1去哪裡了?由于尾數部分是規格化表示的,最高位總是“1”,所以這是直接隐藏掉,同時也節省了1個位出來存儲小數,提高精度。

輸出浮點數二進制位的代碼:

利用共用體,不同類型共用一段内存空間,可以實現同樣的一段0、1串可以不加改變地(不考慮類型轉換規則)按不同的類型解釋輸出。如在共用體中存儲一個float型和一個int型,如果先輸入float的變量值,則可用int型按原樣的比特串輸出,如果先輸入的是一個int型的變量值,則可用float型按原樣的比特串輸出。

#include <iostream> using namespace std; union { float input; int output; } data; void main() { data.input = 178.125; int h=1; h=h<<31; for(int i=1;i<=32;i ) { if((data.output&h)==0) cout<<0; else cout<<1; data.output<<=1; if(i%4==0) cout<<" "; } cout<<endl; system("pause"); } //0100 0011 0011 0010 0010 0000 0000 0000

把上面的代碼寫到一起:

#include <iostream> using namespace std; union { float input; int output; } data; char flag; void printbin1(int val) { int len=sizeof(val)*8; for(int i=1;i<=len; i) { if(val&(1<<len-i)) printf("1"); else printf("0"); if(i%4==0) printf(" "); } printf("\n"); }void printbin2(int val) { printf("浮點數:符号位 階碼(指數位數 127) 尾數位\n"); printf("%2s"," "); printf("階碼"); printf("%6s"," "); printf("尾數\n"); int len=sizeof(val)*8; for(int i=1;i<=len; i) { if(val&(1<<len-i)) printf("1"); else printf("0"); if(i==1 || i==5 || i==9 || i==12) printf(" "); if(i>12) if(i%4==0) printf(" "); } printf("\n"); } void main() { while(1) { printf("\n輸入i,int轉換為二進制,如178,\n"); printf("輸入f,float轉換為二進制,如178.125:\n"); scanf("%c",&flag); if(flag=='i') { printf("請輸入一個int:"); int i; scanf("%d",&i); printbin1(i); } if(flag=='f') { printf("請輸入一個float:"); float f; scanf("%f",&f); data.input = f; printbin2(data.output); } cin.get(); } }

運行效果:

輸入i,int轉換為二進制,如178, 輸入f,float轉換為二進制,如178.125: i 請輸入一個int:1 0000 0000 0000 0000 0000 0000 0000 0001 輸入i,int轉換為二進制,如178, 輸入f,float轉換為二進制,如178.125: f 請輸入一個float:1 浮點數:符号位 階碼(指數位數 127) 尾數位 階碼 尾數 0 0111 1111 000 0000 0000 0000 0000 0000 輸入i,int轉換為二進制,如178, 輸入f,float轉換為二進制,如178.125: i 請輸入一個int:178 0000 0000 0000 0000 0000 0000 1011 0010 輸入i,int轉換為二進制,如178, 輸入f,float轉換為二進制,如178.125: f 請輸入一個float:178.125 浮點數:符号位 階碼(指數位數 127) 尾數位 階碼 尾數 0 1000 0110 011 0010 0010 0000 0000 0000 輸入i,int轉換為二進制,如178, 輸入f,float轉換為二進制,如178.125: -End-

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved