class longlong

【概要】
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) ;

      の様に使う事が出来ます。

COOL