質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1645閲覧

数値を直書きした場合の、数値の型について

AdultMr.

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/09/08 08:59

C言語において下記のようなプログラムを書いたとします。

unsigned int a = 0x1000; if(a > 0x8000){ printf("big"); } else{ printf("small"); }

この場合、0x8000の型はどのような扱いになるのでしょうか?
例えば、int16_tとして扱われる場合があれば、必ずbigが表示されるようになってしまうと思います。
(0x8000はマイナス表示になってしまうため)

それともuint16_tで扱われる、uint32_tで扱われるといった決まりはあるのでしょうか?
私としては符号なし整数として扱われることを前提に、上記プログラムを記載しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

この場合、0x8000の型はどのような扱いになるのでしょうか?

0x8000とだけ書いた場合、リテラルとしての型はintunsigned intlongunsigned longlong longunsigned long longのうち、この数値が収まる最初の型になります。intが32ビットで正の0x8000を納められないのであればunsigned intです。桁が足りなければ伸びる方向に進み、リテラル自体が負の数として解釈されることはありません。

なお、C言語に負の数のリテラルは存在しません-12は、「12という整数リテラルに単項マイナスを適用したもの」と解釈されます。

投稿2020/09/08 09:13

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/08 09:18

C言語は、「1バイトが8ビットでない」環境すら認めているほどに、環境に対する要求が少ない言語です。intやlongのサイズは違いので使いにくい面はありますが、コンパイラが基準にするのはそれらの型です。
AdultMr.

2020/09/08 10:03

分かりやすく説明をいただき、大変ありがとうございます。 数値リテラルに負は存在しないとのこと、理解することができました。 2点ご教授いただけないでしょうか。 1:int型が32bit環境の場合、 0x80000000はint型で表現することができないので、unsigned int型になるという理解で正しいでしょうか。 2:数値リテラルに負は存在しないということは、単項マイナスを適用しない限り、必ず正の値として認識されるという理解でよいでしょうか。
guest

0

ベストアンサー

整数の数値リテラルは、基本的にはintとして扱われます。
intの範囲を超えるサイズのものの場合、自動的に、long、long longと型が拡張されます。
long longでも扱えないサイズのリテラルはエラーになります。

8進数や16進数表記の場合には、int、unsigned int、long、unsigned long、long long、unsigned long longと、unsignedを含めて自動的に拡大されるようです。

なので、0x8000と書いた場合、一般的な環境では、int(32bit)の範囲内に収まるので、intになります。
16bitのintが標準である16bit環境のC言語の場合には、上の法則に合わせてunsigned int(16bit)になるかと思われます。

標準的なintよりも小さなサイズの数値は全てintとなり、自動的に、shortやcharになることはありません。

ちょっとした実験。

C

1#include <stdio.h> 2int main(void){ 3 printf("int :%lu\n",sizeof(int)); 4 printf("long :%lu\n",sizeof(long)); 5 printf("long long :%lu\n",sizeof(long long)); 6 7 printf("1 :%lu\n",sizeof(1)); 8 printf("1K :%lu\n",sizeof(1000)); 9 printf("1M :%lu\n",sizeof(1000000)); 10 printf("1G :%lu\n",sizeof(1000000000)); 11 printf("1T :%lu\n",sizeof(1000000000000)); 12 printf("1P :%lu\n",sizeof(1000000000000000)); 13 printf("1E :%lu\n",sizeof(1000000000000000000)); 14// printf("100E :%lu\n",sizeof(100000000000000000000)); エラー 15 16}

型のサイズは環境によって変わります。

output

1int :4 2long :8 3long long :8 41 :4 51K :4 61M :4 71G :4 81T :8 91P :8 101E :8

投稿2020/09/08 09:13

編集2020/09/08 09:39
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AdultMr.

2020/09/08 09:59

分かりやすくご説明をしていただき、大変ありがとうございます。 10進数表記と、8進数・16進数表記で型の拡張が変わる点も、分かりやすく理解することができました。
AdultMr.

2020/09/08 14:09

詳細な例も出していただきありがとうございます! 16bit環境の場合には、int型ではなくunsigned int型になるとのこと、承知致しました! ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問