ORACLE NUMBER型別內部實現
先來研究NUMBER型別的數字回推演算法
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
1、長度型別沒什麼號說的
2、符號位,這個需要說一下
The sign bit, which is the high order bit (128)
按照文件的說法這個判斷方法是和128進行最高位按位與出來的,如果
這位小於128則是負數,我們使用127試試吧
128的二進位制為1000 0000
127的二進位制為0111 1111
最高位1&0=0 則代表他是負數,
如果是129則是正數
128的二進位制為1000 0000
129的二進位制為1000 0001
最高位1&1=1 則代表他是正數,
3、指數位
正數
128固定為正負數的判斷
65固定 The offset, which is always 65
那麼就是128+65=193就是正數指數的固定數值
負數
固定為62為負數的固定數值
4、數字位
正數
那我們來判斷這樣一個數字
193,64,13,31
那麼就是
193-193=0
(64-1)*100^(0-0) =63
(13-1)*100^(0-1) =0.12
(31-1)*100^(0-2) =0.0030
為63.123
負數
62,38,89,71,102
62-62=0
101-38 = 63 *100^(0-0)=63
101-89 = 12 *100^(0-1)=0.12
101-71 = 30 *100^(0-2)=0.003
102 為排序位不用理會
所以為-63.123
研究了數字的演算法接下來我們使用C語言進行實現
考慮實際的16進位制格式
4,c1,40,d,1f 63.123
5,3e,26,59,47,66 -63.123
04,c1,40,0d,1f,05,3e,26,59,47,66
早期我寫過一個C語言程式使用位域來完成,因為有點久遠了我也不太記得是否驗證過不過先放到這裡
型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
1、長度型別沒什麼號說的
2、符號位,這個需要說一下
The sign bit, which is the high order bit (128)
按照文件的說法這個判斷方法是和128進行最高位按位與出來的,如果
這位小於128則是負數,我們使用127試試吧
128的二進位制為1000 0000
127的二進位制為0111 1111
最高位1&0=0 則代表他是負數,
如果是129則是正數
128的二進位制為1000 0000
129的二進位制為1000 0001
最高位1&1=1 則代表他是正數,
3、指數位
正數
128固定為正負數的判斷
65固定 The offset, which is always 65
那麼就是128+65=193就是正數指數的固定數值
負數
固定為62為負數的固定數值
4、數字位
正數
那我們來判斷這樣一個數字
193,64,13,31
那麼就是
193-193=0
(64-1)*100^(0-0) =63
(13-1)*100^(0-1) =0.12
(31-1)*100^(0-2) =0.0030
為63.123
負數
62,38,89,71,102
62-62=0
101-38 = 63 *100^(0-0)=63
101-89 = 12 *100^(0-1)=0.12
101-71 = 30 *100^(0-2)=0.003
102 為排序位不用理會
所以為-63.123
研究了數字的演算法接下來我們使用C語言進行實現
考慮實際的16進位制格式
4,c1,40,d,1f 63.123
5,3e,26,59,47,66 -63.123
04,c1,40,0d,1f,05,3e,26,59,47,66
早期我寫過一個C語言程式使用位域來完成,因為有點久遠了我也不太記得是否驗證過不過先放到這裡
點選(此處)摺疊或開啟
-
#include <stdio.h>
-
#include <math.h>
-
#include <stdlib.h>
-
-
-
-
double number(int sseek)
-
{
-
struct bin1b
-
{
-
unsigned a1:1;
-
unsigned a2:1;
-
unsigned a3:1;
-
unsigned a4:1;
-
unsigned a5:1;
-
unsigned a6:1;
-
unsigned a7:1;
-
unsigned a8:1;
-
};
-
int sseek=8182;//設定偏移量後期可以直接推算出來
-
int clg,digt,i;
-
double a=0.0;
-
char clgc;
-
char *Ptr;
-
int *Ptrn;
-
struct bin1b *data;
-
FILE *fp;
-
fp=fopen("D:\\c\\95393.dbf","rb");
-
if(!fp)
-
{
-
printf("can't open this file!");
-
}
-
else
-
{
-
fseek(fp,sseek+1,0);
-
fread(&clgc,1,1,fp);
-
printf("%d\n",ftell(fp));
-
clg=clgc;
-
Ptr=(char *)malloc(clg); //分配欄位長度的一個4個單位元組記憶體空間
-
Ptrn=(int *)malloc(sizeof(int)*clg);
-
fread(Ptr,1,clg,fp);
-
printf("%d\n",ftell(fp));
-
for(i=0;i<clg;i++)
-
{
-
data=&Ptr[i];
-
Ptrn[i]=data->a1+data->a2*2+data->a3*pow(2,2)+data->a4*pow(2,3)+data->a5*pow(2,4)+data->a6*pow(2,5)+data->a7*pow(2,6)+data->a8*pow(2,7);
-
printf("%d\n",Ptrn[i]);
-
}
-
-
for(i=0;i<clg;i++)
-
{
-
if(Ptrn[0]<128)
-
{
-
digt=62-Ptrn[0];
-
if((i>0) && (Ptrn[i]!=102))
-
{
-
a=a+(101-Ptrn[i])*pow(100,(digt-(i-1)));
-
}
-
}
-
if(Ptrn[0]>128)
-
{
-
digt=Ptrn[0]-193;
-
if(i>0 )
-
{
-
a=a+(Ptrn[i]-1)*pow(100,(digt-(i-1)));
-
}
-
}
-
}
-
if(Ptrn[0]<128)
-
{
-
a=-a;
-
}
-
else
-
{
-
a=a;
-
}
-
-
return(a);
-
free(Ptr);
-
free(Ptrn);
-
}
-
fclose(fp);
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2128563/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle中dump函式及oracle NUMBER型別內部儲存機制Oracle函式型別
- ORACLE NUMBER資料型別Oracle資料型別
- 【NUMBER】Oracle的NUMBER資料型別特點Oracle資料型別
- Oracle的number資料型別Oracle資料型別
- Oracle中number型別詳解Oracle型別
- Redis 字串型別實現內幕Redis字串型別
- date型別的內部結構型別
- EF:oracle的number型別對映為C#的boolean型別Oracle型別C#Boolean
- 面試官:Redis中集合資料型別的內部實現方式是什麼?面試Redis資料型別
- Redis字串型別內部編碼剖析Redis字串型別
- 物件導向--內部屬性型別物件型別
- 3.6 Java內部類四種型別Java型別
- 面試官:Redis中雜湊資料型別的內部實現方式是什麼?面試Redis資料型別
- 10_深入解析Oracle number資料型別及os層number解析工具分享Oracle資料型別
- KVO的內部實現
- ora-600內部錯誤的型別型別
- 淺析number型別的值型別
- 征服number型別的input框型別
- 測試NUMBER型別的效能型別
- number(p,s)型別詳解型別
- javascript型別系統——Number數字型別JavaScript型別
- [20150503]關於oracle的number型別.txtOracle型別
- zt_ora-600內部錯誤的型別型別
- mysqldump的內部實現原理MySql
- gostring的內部實現Go
- SDWebImage內部實現過程Web
- 【NUMBER】有關Oracle NUMBER型別定義中precision和scale的測試和總結Oracle型別
- 泛型,內部類泛型
- iOS中atomic和nonatomic區別及內部實現iOS
- JS -- number資料型別詳解JS資料型別
- number型別的顯示問題型別
- [20141009]oracle資料型別內部編碼.txtOracle資料型別
- HashMap的內部實現機制HashMap
- 解讀Promise內部實現原理Promise
- 一個簡單函式—Number型別轉換Date型別函式型別
- Oracle內部事件Oracle事件
- 關於call, apply, bind方法的區別與內部實現APP
- 匿名內部類泛型泛型