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の値としてどのような値になるのでしょうか?
No.1ベストアンサー
- 回答日時:
> これらの要素を数字(文字でない)として扱えるようなのですが、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;
}
No.6
- 回答日時:
>No.4さん
>・char は符号付きまたは符号なしのどちらか
>・符号付きの整数の表現方法は「2の補数」「1の補数」「符号+絶対値」のいずれか
>・char は最低 8ビット
>ということが明記されています
JIS規格ではそのような定義があるのですね、勉強になりました。
>質問者様
ご質問の内容と直接に関連のない部分で話題を広げてしまいました。
申し訳ありませんでした。
No.5
- 回答日時:
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型を使うのが最も効率がいいと思います。
No.4
- 回答日時:
ではちょっとだけ.
まず, この質問において「どのような処理系を使っているか」が明示されていません. したがって, JIS X3010 で与えられる仕様を想定すべきです. そして, その仕様では
・char は符号付きまたは符号なしのどちらか
・符号付きの整数の表現方法は「2の補数」「1の補数」「符号+絶対値」のいずれか
・char は最低 8ビット
ということが明記されています (ただし具体的にどうであるかは処理系定義).
ということで
・char が符号付きの場合規格によって保証される範囲は -127~127
・char が符号なしの場合最低保証範囲は 0~255
・char が 9ビットなら -255~255 あるいは 0~511 の可能性もあり (もちろんさらにビット数が多いこともあり得る)
となります.
よしんば Visual C に限定したとしても「char は符号付き」とは言いきれない.
No.3
- 回答日時:
No.1です。
No.2さん
> ちなみに char 1個は 1byte ですがその範囲は必ずしも -128~127 とは限りません
後学の為に具体的な事例を教えていただけると助かります。
ちなみにunsigned charでは0~255を表すということは理解しております。
※例えば
1byteは256種類のパターンを表すことができるので、
0x00 → 100
~
0xFF → 355
という風に、独自の意味を定義して使用できるよといった意味合いですか?
No.2
- 回答日時:
コンピュータの中では, あらゆるものが数値で表現されます. そして, それは文字とて例外ではありません. 必要に応じて人間が「ここでは文字として使おう」とか「ここは数値だ」とか思うだけで, コンピュータとしては「全てが数値」なのです. とはいえ, 数値として使うことを前提とするなら char にするのは決して望ましいことではありません. 余程でなければふつうに int などを使うべきです.
ちなみに char 1個は 1byte ですがその範囲は必ずしも -128~127 とは限りません. あと, 文字コードも ASCII だけと限定されているわけでもありません. 勘違いしてる人もけっこういるようだけどね.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++の標準入力の書き方 6 2023/02/23 23:53
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
'\\0'とはなんですか?
-
fstream型オブジェクトを関数の...
-
エクセルのMID関数は、C言語では?
-
c言語でポインタ変数を用いた配...
-
ポインタのポインタの使い方
-
wsprintf( ポインタ , "%d" , "...
-
36進数
-
C言語の文字リテラル中の16進文...
-
strcat関数を自作したいです
-
文字列str内の全ての数字を...
-
動的メモリの初期化方法について。
-
小数点入りの文字列をfloat型に...
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
CStringからchar*への型変換に...
-
char型にint型の数値を代入する。
-
文字列の途中から途中までを抽出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報