【概要】
BC++にて、64ビット型の整数を扱う場合に利用出来るlonglongクラスを提供する。
尚、このクラスは、基本型として動作させたい為、特別に、インクルードファイルを指定しない。
【詳細】
現在、C++でも、long long型の使用方法は確立されていないが、windowsでは、LONGLONG型,hyper型が定義されている。
多分…,
typedef __int64 LONGLONG ;
typedef __int64 hyper ;
これから分かる様に、基本的には、型として__int64型が存在しており、これを使用すれば、事実上、64bit型の整数が定義出来るが、これを正常に表示,文字列に変換若しくは文字列を64bit型の整数に変換出来るインタフェースが用意されていない。
強いて言えば、
#include<iostream>
using namespace std;
を前提に、
__int64 x=0x123456789012 ;
cout <<dec<<x<<endl ;
とすれば、コンソールへの表示は可能であるが、この様な方法を使わなければ、これを文字列に変換したり、表示したり出来ないので、実質上、LONGLONG型,hyperは使えない事になってしまう。これを、解決する手段として、longlongクラスを提供する。
まず、llong型を新規で定義する。
typedef __int64 llong ;
これを、効果的に使用する手段として、LNGLONG共用体を提供すると共に、longlongクラスを提供する。
【機能】
出来る限り、int,char等のデータ型と同様に扱える様に設計しているが、不都合のある場合も考えられる。また、乗除算については不要と考えて、対応していないので、必要な場合は、継承して拡張するものとする。
longlong型の変数として、0〜0xffffffffffffffffまでの数値を扱う事が出来る。(符号付きの16進数出力は対応無し) 10進では、-9223372036854775808〜9223372036854775807である。unsigned longlongについては、文字列出力のみ暫定対応しており、0〜18446744073709551615の範囲の10進数として出力する事が出来る。
- 代入
- コンストラクタ代入
longlong xx ; //0が代入される。
longlong xx(12345678901234) ;
longlong xx(zz) ; //LNGLONG型共用体からの入力
- 関数代入
longlong yy ;
yy.val(12345678901234) ;
yy.val(xx) ;
yy.xval("ABCDEFABCDEF") ;
// HEX文字列入力
yy.xval("ABCDEF 123456") ;
// HEX文字列は、空白による間隔を許容する
yy.xval("0xFFFF FEDC BA") ;
// HEX文字列は、先頭に0xを冠する事を許容する
yy.xval("0xabcdEF") ;
// HEX文字列は、大文字,小文字を許容する
▲
yy.xval("-ABCDEF") ;
→ yy.xval("ABCDEF") ;
// 符号(-)付きのHEX文字列は許容されない。-を除去した形で採用される。
▲
yy.xval("1234567890ABCDEFA") ;
→ yy.xval("234567890ABCDEFA" ) ;
// 16桁(64bit)を越えた場合、文字列末尾から16桁が採用される
yy.dval("123456789900") ;
//DEC文字列入力
yy.dval("-12345678900") ; //DEC文字列は、符号付きを許容する。
// 但し、-の前にはスペースしか許容されない
yy.dval("123,456,789,012") ; // 数字以外の文字が混入している場合も許容する。
▲
yy.dval("12345678901234567890") ; → yy.dval("2345678901234567890") ;
// 19桁を越えた場合は、文字列末尾から19桁が採用される。
- オペレータ代入
longlong zz ;
zz=0x123456789012 ;
zz=xx ;
zz<="1234 5678 90AB" ; // HEX文字列代入(文字列の制限は、関数代入と同様)
zz<<="1234567890" ; // DEC文字列代入(文字列の制限は、関数代入と同様)
の3通りの代入をサポートする。
※ 数値は、16進数でも、10進数でも構わない。
- 加減算
- 関数加減算
xx.add(2234567890) ;
xx.add(yy) ;
xx.dec(2334445555555) ;
xx.dec(yy) ;
- オペレータ加減算
xx+=1234567890 ;
xx+=yy ;
zz=xx+yy ;
xx-=1234567890 ;
xx-=yy ;
zz=xx-yy ;
※ 文字列型の加減算には対応していない。
- 結果出力
- llong型
llong aa=xx.val() ;
- 即時表示型出力
printf("%s\n",xx.lldec()) ; // 64bit符号付き10進出力
printf("%s\n",xx.ulldec()) ; // 64bit符号無し10進出力
printf("%s\n",xx.llhex()) ; // 64bit符号無し16進出力
※これらの出力は、クラス内のバッファのポインタ返しなので、即座に表示等に使用する,または、ローカルバッファにコピーする等して使う場合のみを保証する。同インスタンスに対して、次の操作やdeleteを行うと、内部のバッファが更新されてしまうので、結果が保証出来ない。従って、
printf("dec=%s hex=%s\n",xx.lldec(),xx.llhex()) ;
は、保証出来ない。
- 文字列コピー型出力
xx.lldec(buff) ;
buff<<=xx ; // DEC文字列を、buff[]にコピーするオペレータ出力
xx.ulldec(buff) ;
xx.llhex(buff) ;
buff<=xx ; // HEX文字列を、buff[]にコピーするオペレータ出力
こちらの出力は、ローカルバッファにコピーされるので,
char bf1[256],bf2[256] ;
bf1<<=xx ; bf2<=xx ;
printf("dec=%s hex=%s\n",bf1,bf2) ;
の様に使う事が出来ます。
|