プロが教えるわが家の防犯対策術!

static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

で定義した時、
関数の中で、このdaytabを呼んだ場合、これらの要素を数字(文字でない)として扱えるようなのですが、charの定義で何故数字として扱えるのでしょうか?また、これらの要素の値は、実際のcharの値としてどのような値になるのでしょうか?

A 回答 (6件)

> これらの要素を数字(文字でない)として扱えるようなのですが、charの定義で何故数字として扱えるのでしょうか?



char型は1byteの範囲(-128~127)の数値を扱うことのできる型です。
この型の変数の値をasciiコードとして考えると1文字を表せるということです。文字専用の型というわけではありません。

-----------------
#include <stdio.h>

int main(void){
char c;

c = 97;
printf("%d\n", c); /* 97 */
printf("%c\n", c); /* a */

c = 'a';
printf("%d\n", c); /* 97 */
printf("%c\n", c); /* a */

return 0;
}
    • good
    • 0

>No.4さん


>・char は符号付きまたは符号なしのどちらか
>・符号付きの整数の表現方法は「2の補数」「1の補数」「符号+絶対値」のいずれか
>・char は最低 8ビット
>ということが明記されています

JIS規格ではそのような定義があるのですね、勉強になりました。


>質問者様
ご質問の内容と直接に関連のない部分で話題を広げてしまいました。
申し訳ありませんでした。
    • good
    • 0

C言語はあまり詳しくないのですが・・・



まず用語について、「定義」ではなくて「宣言」ですね。

char型を数値として扱える理由はNo.1の方のご回答のとおりです。
所詮コンピュータはビットが立っているか立っていないか(電圧的にhiかloか)の列で情報を表現しており、
だいたい8ビット単位でそれを数値とみなしています。
C言語では、数値として扱える最小単位がchar型です。
8ビットとは、いわゆる半角英数文字を表現するのに十分なビット数を持っているので、
文字や、それが連続した領域に並べられた文字列を表現するのに都合がよいため、char型と呼ばれています。

以下は余談ですが・・・

char型を数値として扱うことは当然できますが、用途としてはよほどメモリをケチりたい場合に利用するぐらいです。
たとえば、利用する数値の地域が十分に小さく、また8ビットプロセッサでメモリフェッチ幅も8ビット、
さらに搭載メモリがとても小さい組み込み機器などでは重宝する技法だと思います。

しかし、現代のパソコンでは、搭載メモリが数ギガバイトだし、
そもそもメモリフェッチ幅が32ビットとか64ビットとかなので、
実は連続した領域に8ビットで区分けされたデータを個々の数値として扱うには不向きです。
Intel系32ビットCPUでは8ビットレジスタもありますが、
32ビット中下位16ビットの上下8ビットずつしか直接アクセスできません。
64ビットCPUではレジスタは16ビット単位でしか扱えません。
このため、情報を取り出すためには、内部的にはシフト演算と論理積演算を組み合わせる必要があり、
コンピュータ的にはとても非効率な演算をしなくてはならず実行が遅くなります。

なので、ご質問文で挙げられている例題は、「コンピュータは情報を数値で表現している」ということを理解するにはいい問題ですが、
数値を扱うまともなプログラミングをするという意味では、素直にint型を使うのが最も効率がいいと思います。
    • good
    • 0

ではちょっとだけ.



まず, この質問において「どのような処理系を使っているか」が明示されていません. したがって, JIS X3010 で与えられる仕様を想定すべきです. そして, その仕様では
・char は符号付きまたは符号なしのどちらか
・符号付きの整数の表現方法は「2の補数」「1の補数」「符号+絶対値」のいずれか
・char は最低 8ビット
ということが明記されています (ただし具体的にどうであるかは処理系定義).

ということで
・char が符号付きの場合規格によって保証される範囲は -127~127
・char が符号なしの場合最低保証範囲は 0~255
・char が 9ビットなら -255~255 あるいは 0~511 の可能性もあり (もちろんさらにビット数が多いこともあり得る)
となります.

よしんば Visual C に限定したとしても「char は符号付き」とは言いきれない.
    • good
    • 1

No.1です。



No.2さん
> ちなみに char 1個は 1byte ですがその範囲は必ずしも -128~127 とは限りません

後学の為に具体的な事例を教えていただけると助かります。
ちなみにunsigned charでは0~255を表すということは理解しております。

※例えば
1byteは256種類のパターンを表すことができるので、
 0x00 → 100
 ~
 0xFF → 355
という風に、独自の意味を定義して使用できるよといった意味合いですか?
    • good
    • 0

コンピュータの中では, あらゆるものが数値で表現されます. そして, それは文字とて例外ではありません. 必要に応じて人間が「ここでは文字として使おう」とか「ここは数値だ」とか思うだけで, コンピュータとしては「全てが数値」なのです. とはいえ, 数値として使うことを前提とするなら char にするのは決して望ましいことではありません. 余程でなければふつうに int などを使うべきです.



ちなみに char 1個は 1byte ですがその範囲は必ずしも -128~127 とは限りません. あと, 文字コードも ASCII だけと限定されているわけでもありません. 勘違いしてる人もけっこういるようだけどね.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!