COBOLのデータ型とは?S9(6)の意味や他言語(C言語)での実現方法を知りたい

このQ&Aのポイント
  • COBOLのデータ型であるS9(6)は符号ありの整数を表すものです。しかし、S9(6)の値が「00000A」となっていることから、Aが何を意味しているのか疑問が生じました。調査の結果、Aはゾーン10進数と呼ばれる特殊な数値を表す記号であることがわかりました。
  • ゾーン10進数はCOBOLに特有の表現方法であり、その詳細な意味を知ることは困難です。COBOLにはゾーン部を明示的に指定する記述方法は存在しないようです。
  • S9(6)というデータ型を他の言語(C言語)でどう実現するかについては、具体的な方法を提供することはできません。S9(6)はCOBOLのデータ型であり、他の言語では同等の表現が存在しない場合もあります。
回答を見る
  • ベストアンサー

COBOLのデータ型

こんばんわ。 現在研修をしており、COBOLの勉強をしております。 COBOLを他言語に置き換える作業を後に担当することになるようです。何の言語かは聞いておりません。勉強している中いくつかわからない点がでました。ご教授いただければと思います。 S9(6)というデータ型は符号ありの整数ということは調べました。 ファイルレコード内に上記のデータ型が存在し、出力ファイルを調べると「00000A」 という値が出力されていました。 ここでふと思ったのがAって何だ?と思いました。そもそも10進数なのか?という疑問が出て 調べるとゾーン10進数という特殊な数値のようです。 ゾーン10進数を調べても全然意味がわかりません。ゾーン部を○○とする!とかゾーン10進数の説明している記載がありますがCOBOLにはそんな記述ないし・・・ とまぁ私が知りたいのはS9(6)というデータ型をどう他言語(C言語)でどう実現しようかという内容がしりたいです。また「00000A」は実際の10進数ではどういう数値かというのも知りたいです。 以上、お手数ですがどうかよろしくお願い致します。

  • zaqwe
  • お礼率15% (19/123)

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

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.7

00000A→000001+ 00000B→000002+ 00000C→000003+ ・ ・ 00000K→000002- 00000L→000003- となります。 KKKKKK→111111- KLKLKL→121212-  ではありません。最終桁にのみ、符号が乗るのです。 111111-  なら 11111J 121212- なら 12121K です。 注意>0+は'{', 0-は'}'です。AやJではありません。 データを変換なさるのですか? ならば、最終桁だけ変換が必要です。

zaqwe
質問者

お礼

よくわかりました。ありがとうございました。

その他の回答 (7)

  • root139
  • ベストアンサー率60% (488/809)
回答No.8

#4です。補足ありがとうございます。まず EBCDIC と思って間違い無さそうですね。 既に回答が付いていますので、少しだけ。 しつこい様ですが、慣れるまでは1バイト上下2段の16進表記で考えた方が良いと思いますよ。 例えば、-121212 の場合、下記の様になります。  F F F F F D   ← 1~5桁は「F」固定。6桁目は「C」(+)か「D」(-)  1 2 1 2 1 2   ← 下の段には十進数の数値がそのまま入る 上の段(上位4bit)が「F」の場合は、EBCDICでは下の段(下位4bit)の値そのものの数字になります。 最後の桁は上の段(上位4bit)が「C」か「D」になりますが、「C」の場合はEBCDICでは「{」とA~I、「D」の場合はEBCDICでは「}」とJ~Rとなります。 従ってこの場合は、文字列表現が「12121K」となります。 逆に考えると、文字列表現で、1~5桁に数字以外のものが含まれる場合や、6桁目に「{}」とA~R以外の文字が入っている場合は S9(6) としては不正です。 なお、環境によっては「{」「}」と書いたところが別の文字になる場合も有るようです。 それから、実際の変換作業では、データがEBCDICのまま来るのかASCII等に変換されて来るのかでかなり変わってくると思いますよ。

参考URL:
http://www.ffortune.net/comp/develop/data/kazu.htm
zaqwe
質問者

お礼

なるほど、ありがとうございました

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.6

No2です。 すいません。00000Aを、十六進表記だと思い込んでいました。

  • kinta03
  • ベストアンサー率41% (7/17)
回答No.5

お疲れ様です。 以前に回答を寄せたQAですが 少しは参考に為るかと思います。 http://okwave.jp/qa/q7985639.html

参考URL:
http://okwave.jp/qa/q7985639.html
zaqwe
質問者

お礼

参考にさせていただきます。 ありがとうございました。

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

まず、どんな環境でどの様にファイルを表示した際に「00000A」と表示されたのか補足して下さい。 また、今日日の一般的なPCやUNIX系OSの文字コードはASCII系統ですが、COBOLがよく使われる汎用機の環境では全く異なるEBCDICという系統の文字コードで有ることも多いですので、分かれば文字コードも書いて下さい。 http://ja.wikipedia.org/wiki/EBCDIC http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3J3820/ISUS0268.HTM ただ、断定は出来ませんが、#1さんの書かれている通り、EBCDICで+1を表したものという線が強いかと思います。 EBCDICの「00000A」を、16進数表記で1バイトを上下2段にして書くと下記の様になります。  F F F F F C  0 0 0 0 0 1 下の段はそのまま符号を除いた値になると考えて下さい。 上段の1~5桁目の「F」(1111)はゾーンといって数値である事を表しているだけです。最後の桁の「C」(1100)はプラスで有ることを表しています。マイナスの場合は「D」(1101)です。 ただし、「F」「C」「D」は文字コードや環境によっては違う値になる場合も事も有ります。

参考URL:
http://www.ffortune.net/comp/develop/data/kazu.htm
zaqwe
質問者

補足

現在会社から与えられたCOBOLソースを眺めて解析しているだけの状態です。その為COBOLの開発環境はありませんです。 ただソースを見るとEBCDICという表記があるのでEBCDICだと思います。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

No1です。 >1バイト(8ビット)の下位4ビットで表現出来ます。 > (0000,0001,0010,0011,0100,0101,0110,0111,1000,1001)    ↑ 0000が抜けていました。m(__)m

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

ゾーン十進数とは、8bitずつで十進1桁を表して、それぞれの桁の下4bitが数字を表します。下4bitは必ず0~9です。なので、00 00 0A というのはあり得ません。 おそらく S9(6) ではなくてさらに comp とかついてたのでは? comp ・・・・ 二進数の整数 ( Cだと int とか short int とか long long int とか) comp-1 ・・・・ 単精度実数 ( Cだと float ) comp-2 ・・・・ 倍精度実数 ( Cだと double ) comp-3 ・・・・ パック十進数 ( Cの型には無し ) しかし、どれにしても、00 00 0A というのは変ですね。なんか間違えてませんか? あと、どこのメーカーのCOBOLですか?

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

S9(6)ですが、6バイト使います。10進数ですから、 1バイト(8ビット)の下位4ビットで表現出来ます。 (0001,0010,0011,0100,0101,0110,0111,1000,1001) 上位4ビットは1111が入っていますが1の位のみ、符号が入っています。 (1111は符号なし、1100が+、1101が-です。 一の位以外は f0,f1,f2,f3,f4,f5,f6,f7,f8,f9で格納され、EBCDICコードにより0,1,2,3,4,5,6,7,8,9と判断されます。 一の位は+の時、 c0,1,c2,c3,c4,c5,c6,c7,c8,c9で格納され、EBCDICコードにより{,A,B,C,D,E,F,G,H,Iとなります。 位置の位が-の時、 d0,d1,d2,d3,d4.d5.d6.d7.d8.d9で格納され、EBCDICコードにより},J,K,L,M,N,O,P,Q,Rとなります。 ということで、00000Aは000001+でした。 C言語になさるなら、intでいいですよ。ただし、7桁入るときは6桁に切られることをお忘れなきよう。

zaqwe
質問者

補足

なんとなく理解できたのですが、一番知りたいことは 00000A→000001+ これをCで実現する場合、相互の変換プログラムが必要だと思います。それをどう実現するかです。 上記の回答だけを見ると 00000A→000001+ 00000B→000002+ 00000C→000003+ ・ ・ 00000K→000001- 00000L→000002- という変換になる感じですが合ってますでしょうか? KKKKKK→111111- KLKLKL→121212- という変換になるという認識ですが・・あってるかな これが合ってる場合文字1文字1文字見て行って変換する処理にしようかと考えています。

関連するQ&A

  • COBOLでの可変長定義について

    unix環境下でCOBOL85を使用しています。 あるデータを可変長でWRITEしていくのですが、 データにヘッダー情報みたいなものが付加されてしまい困っています。 ヘッダー情報を付加しないようにするにはどうすればいいのでしょうか? 定義:  FD Aファイル RECORD IS VARYING 1 TO 100 DEPENDING ON A-CNT.  01 A-DATA PIC X(100). とか  FD Aファイル RECORD IS VARYING IN SIZE DEPENDING ON A-CNT.  01 A-DATA PIC X(100). というパターンで試しています。 Aファイルにaaaという3バイトデータをWRITEすると、 COBOL85020315020304・・・・・aaaというデータが出力されます。 あるコボラーに聞くと「定義がおかしいからでしょう」と言ってたのですが、 どうおかしいかは本人もわからないようです。 どうすればヘッダー情報(COBOL85020315020304・・・・・)がつかず、 可変長でWRITEできるのでしょうか?教えて下さい。

  • COBOL言語で開発できますか?

    SQL Server2000のデータ処理をCOBOL言語で開発できますか? 社内システムの開発コスト低減のためシルバー人材を使い安くあげたいと考えています。田舎のシルバー市場ではOPEN系言語を使える人が十分にはみつかりません、それでCOBOLを使って開発できないかと考えました。 すべての業務をCOBOLで開発するのではなくデータを抽出し加工してテキストデータをつくる部分をCOBOLで行えないかと考えています。 (欲を言えばレコードの追加や更新もできればこしたことはないのですが) システムの寿命は約10年と見積もっています

  • COBOL97でのプログラム作成に関する質問です。

    COBOL97でのプログラム作成に関する質問です。 画面からデータを入力して、ファイル(レコード)出力をします。画面上(FORM使用)の項目 に、メモリ内の内容(WORD等の他アプリからマウスにてコピーしたデータ)を貼り付ける方法 はありませんでしょうか。

  • オラクルSQLでつくったデータをcobolで読み込みたい

    オラクルSQLでつくったテーブル&データを、 cobolで読み込んで使うにはどうすればいいのでしょうか? 例えば、 この「ひよこグミ」さんのページ http://www16.plala.or.jp/hiyokogumi/ のmission3にある「ファイルを読む」ですが、 SELECT A-FILE ASSIGN TO \"c:\\cobol\\lst001.cbl\" を記述する必要があるそうですが、このc:\\cobol\\lst001.cbl に当てはまる部分に、どうやったらSQLでつくったデータを当て込めるのか、 お伺いしたいです。

  • <COBOLでのSJISファイル出力について>

    <COBOLでのSJISファイル出力について> COBOL(開発環境はNETCOBOLです。)にて以下のような処理は可能でしょうか? 1.SJISで記載されたファイルを読み込む。 2.1のファイル内の全角カナについて半角カナに変換する。   ※数値項目などは特に変換しない。 3.2で返還した項目を置換後、再びSJISファイルとして出力する。 COBOL・文字コード共に理解が浅く答えが見つけられない状態です。 可能・不可能だけでもご教授頂けると大変助かります。 申し訳ありませんがよろしくお願いいたします。

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • COBOLの出力処理で簡潔に

    A、B、Cがあってそれぞれフラグがたっていたら出力する AorB両方たっていた場合はAのみで。 出力する位置もA、BがたってなくてCのみの場合は詰めて表示する これを簡潔に書けないでしょうか? 言語はCOBOLです。

  • COBOLを最近はじめたのですが

    COBOLを最近はじめたのですが データの定義のところで A PIC 9(10)S. B PIC S9(10). とあったのですがSの意味がわかりません。 左にあったり右にあったりします。 どちらも同じ意味なのでしょうか

  • 大量データ(csv)ファイルのインサート

    1分に1回レコードが出力されたログファイルがあります。 これはCSV形式のファイルです。ファイルは15ファイルあります。 各ファイルの列数は違っていて60~260まであります。 必要なデータが記録されている列もファイルによって違いますが 各ファイルともいらない列が半分くらいありデータは無いか"-"になっています。 データは大体整数4桁小数2桁の数値です。 毎月一回集計しないといけないので各ファイルに対応したテーブルを作り データを読み込みたいと思います。 過去分を持つとレコード数が増えるので毎回読み込みからにしたいと思います。 データをテーブルに取り込むやり方を考えています。 VBでシステムを作っているのでファイルを1行ずつ読み 必要なデータをインサートするのがいいのか SQLServerの機能を使って全部読み込むのがいいのか 何を調べて判断すればいいのかアドバイスをお願いします。 VBは2008でSQLServerも2008でやろうかと考えています。

  • COBOLの検索方法について

    はじめまして。今、COBOLでプログラムを作成しているんですが初めて触る言語でわからない事が多いです。その中でデータを最後から検索して最初のスペースがあれば、それより前のデータをを出力するというのがあるのですが、やり方がよくわかりません。わかりやすく教えてもらえませんか? 図で表すと AAAAAA BBBBBB CCCCCCCC これをCから検索して、最初のスペース(BとCの間)から左側を出力するプログラムで