32bit環境で64bit演算を行う方法

このQ&Aのポイント
  • 秀丸マクロでunsigned _int64(20桁)の数値文字列の引き算をする方法を教えてください。
  • 秀丸ではint(10桁)しか扱えないため、文字列をブロックに分けてロールオーバーや桁上がりを考慮しながら引き算を行っていますが、計算結果が期待通りになりません。
  • 職場でのインストール制限があるため、できれば秀丸を使用した解決方法を教えてください。
回答を見る
  • ベストアンサー

32bit環境で64bit演算

秀丸マクロ、プログラム初心者です。 秀丸マクロでunsigned _int64(20桁)の数値文字列の引き算をしたいのですが、うまくいきません。 秀丸で扱えるのがint(10桁)のため、文字列を単純に数値変換して計算ががきません。 20桁の文字列を2桁、9桁、9桁の3ブロックに分けて、unsigned _int64のロールオーバーや桁上がり(ブック上がり)を考慮しながらブロックごとに引き算をし、文字列に戻しているのですが、計算結果が期待通りになりません。 秀丸でのよい方法、または秀丸ではなくとも、上記と同じことをしているソースなどあれば教えていただけると幸いです。 ちなみに職場環境でインストール制限等がありできれば秀丸がよいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

・10桁と書いてありますが、表現できるのは符号付き32bitの範囲なので、99...9まで全て使えるわけではありません。 ・比較的簡単な手段は、配列を使って1桁1要素にして、小学校の筆算の要領でやることだと思います。 ・その他、なにがどううまくいかなかったのかが不明なので、回答できません

arginine2
質問者

お礼

kmeeさん 返信ありがとうございます。 方法論としてよいやり方、極力スマートなやり方ががないかと思っていました。 でもようやく3ブロックに分けた計算で正しく計算ができました。 >配列を使って1桁1要素にして、小学校の筆算の要領・・・ なるほどですね。 ロールオーバーしていたら最大値からの引き算を加えればよいのですね。 スマートにできそうですね。 作りなおそうかな。。。。 ありがとうございました。

関連するQ&A

  • 論理演算について

    Cを勉強中の者です。論理演算についてよくわからいことがあります。 以下のソースコードを実行し結果が真なら0001、偽なら0000が出力されるプログラムを作りました。 #include <stdio.h> int main(void) { unsigned short a = 0x1234; unsigned short b = 0xfafc; unsigned short c = 0xcdef; unsigned short x, y; x = a && b; y = b && c; printf("x=%04x\n", x); printf("y=%04x\n", y); return 0; } 結果はx=0001, y=0001となります。y=0001はbとcの文字列がそれぞれfとcをを持っているので演算による結果は納得できますが、x=0001はaとbの文字列には共通するものがないのになぜx=0000ではないのでしょうか? また0xが頭に付く表現は16進数だと強調するためにあるのですか? 説明に不足があればまた足しますのでよろしくお願いします。

  • TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法

    TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法ですが どうすればよいでしょうか? int test(LPCTSTR s) { int a, b, c, d; /* TCHAR?型文字列を数値のintに変える方法???  a = 12の前2桁 b = 34の2桁 c = 5の最後の1桁 */ d = a + b - c; return d; } ret = test(_T("12345")); の場合、retに41が返ってきてほしい。

  • 配列について

    こんにちは。 int p[1000]という整数型の配列を作成しました。 例えば、 p[0] = 1; p[1] = 2; p[2] = 3; ・ ・ ・ p[99] = 100; を格納し、配列の長さ?を調べる際、 unsigned int len = 0; while(p[len]!='\0') len++; とすることで調べることが可能でしょうか?p[100]番以降に0が格納されている場合それがナル文字となるのでしょうか? また、char c[1000]と文字列型の配列を作成し、文字列の数値を格納していく場合、一桁であれば要素1個(1Byte?)で格納できますが、二桁以上であれば要素2個以上(2Byte以上←あっていますでしょうか)必要です。 c[0]='1' c[1]='2' c[2]='3' c[3]='4' ・ ・ ・ c[9]='1' c[10]='0' c[11]='1' c[12]='1' ・ ・ ・ ここで問題なのですが、文字列10と文字列11の判別はできないのでしょうか? 110111が連続している場合も値110と値111と判別できないのでしょうか? 値を格納する場合は、整数型のint c[1000]を用意するという事でしょうか? よろしくお願いします。

  • 文字列をint型にキャスト

    文字列をunsigned int型キャストし,それをある演算をして 正の整数に変換したいのですがどうすればいいですか? int ca(char *s) { unsigned int h; int key; h = (unsigned int)s; //文字列を演算し 0~254 の整数にする// key = h % 254; return key; } int main() { char moji[32]; moji = "moji"; unsigned int c; c = ca(moji); }

  • Excelで数字を4桁区切りにする文字列を登録したい

    桁数の多い数字は、普通は3桁ごとに「,」で区切りますが、日本では4桁 ごとに桁上がりする読み方が普通なので、 (1234兆5678億9012万3456円など) 3桁区切りでは読みにくくて困ります。 Excel2003では、書式→セル→表示形式→ユーザー設定→種類の中 に4桁区切りにする設定の文字列が無いので、 [>100000000]0!,0000!,0000;[>10000]0!,0000;0 を書き込んで4桁区切りにしていますが、文字数が41文字もあり 「!」「;」「,」など紛らわしいので、その都度書き込むのが苦痛です。 種類の文字列には、沢山の例が示されていますが、この中に上のような 文字列を登録して、いつでも一発で使えるようにはできないものでしょうか。

  • Excelマクロで置換

    Excelマクロで置換 セルA1に6桁・スペース・24桁の数字が入っています。 最初の6桁に130,397,430,440が含まれているシートを選択 そのシートの中に "ああああ"があったら"ああああい"に "いいいい"があったら"いいいいう"に "うううう"があったら"ううううえ"に と置換をするマクロを書きたいと思っています。 置換する対象の文字列は多いので別マクロで作成し呼び出したいと考えています。 シートは1ブックに30シート程。何シートあるかはブックによって変わります。 現在マクロの記録を使って試行錯誤しているのですが なにぶん初心者なのでなかなかうまくいきません。 どなたかご教授頂ければと思います。

  • 文字列の計算について。。。

    Excelでなのですが、外部データの取り込みをしました。 その時に、文字列で取り込んだ数値を計算したいのですが、 うまく出来ません。 セルの書式設定で数値にしたのですが、計算出来ません。 関数を使って数値に変換すると出来たのですが、 50枚シートがあるものが10ブックあります。 計算したい列もそれぞれのシートでばらばらなので困ってます。 簡単に出来る方法はないでしょうか?

  • 擬似言語のある処理について

    擬似言語についてわからないことがあります。 このプログラムはスタックを使って、実数値を10進数字に変換するプログラムです。 今回質問するのは、このプログラムの中でも数値を一桁ずつ10進数字に変換して、スタックに詰め込む部分です。 Fintは整数部分。Idxは変数。 IntはFの小数部をカットする。(つまり、整数部分だけにする処理です。) Chr[]={0,1,2,3,4,5,6,7,8,9},T (Chrは数値に対応する文字列を格納したものです。) Fint←Int(F) 繰り返し処理 Fint>0ならば ・Idx ← Fint - (Fint ÷ 10) × 10;Fintの最下位桁をIdxに取り出す。 ・Push(Chr[Idx]);最下位桁Idxに対応する数字をスタックにプッシュする ・Fint←Fint÷10;次の桁を最下位の桁にシフトする。 繰り返しで上へ 上記の「Fintの最下位桁をIdxに取り出す」という処理は たとえば、12,345という数字があったならば、12の最下位桁2を取り出すということなのだと思いますが、式に当てはめて計算すると 12-(12÷10)×10となりIdxに0という数字が格納されます。 その後に、Chrで0という数値を拾ってきて文字列0が格納されることになります。 しかし、問題文を見ると12,345という数字を変換すると12,345という文字列になっておりなぜ0?になってしまうのという話になります。 私の解釈は間違いだらけだと思いますが訂正していただけると 大変うれしいです。

  • 数値を4桁の文字列に戻す方法

    上限4桁の数値を、同じく4桁の文字列に戻すにはどうしたらよいでしょうか? ASC関数を使って「数値」を「文字列」にするのはできます。 しかし、例えば『1』にASC関数を使用すると、『0001』ではなく、文字列の『1』になります。 また、書式で『1』を『0001』に見せるのも不可です。『0000』~『9999』の4桁の文字列に打ちかえるには、どうしたらよいでしょうか?

  • perlの型と8進数、10進数

    ある文字列からsubstrで3桁の数値を切り取り、計算に使いたいのですがゼロ詰めの数値の場合8進数になると思っていたのですが、文字列の場合は10進数の数値になります。 これは仕様でしょうか? perlは型がないので、AもBもCも同じ値だと思っていましたが、 そのあたりについて詳しい方、違いを知っている方教えて頂けますか? #-- A -- my $s = "007008009010"; print int( substr($s, 0, 3) ) . "\n"; print int( substr($s, 3, 3) ) . "\n"; print int( substr($s, 6, 3) ) . "\n"; print int( substr($s, 9, 3) ) . "\n"; print; #-- B -- print int("007") . "\n"; print int("008") . "\n"; print int("009") . "\n"; print int("010") . "\n"; print; #-- C -- print int(007) . "\n"; # 7 #print int(008) . "\n"; #print int(009) . "\n"; print int(010) . "\n"; # 8

    • ベストアンサー
    • Perl

専門家に質問してみよう