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

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

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

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

Q&A

解決済

1回答

29744閲覧

C言語を勉強中です

jabu

総合スコア38

C

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

0グッド

3クリップ

投稿2015/03/02 16:32

現在、独学でC言語を勉強中ですが、どうしても解らない所があります。
下記のコードで、count_bits関数を呼び出す時のreturn count_bits(~0U);の引数の
『~0U』の『U』とは何を表すのでしょうか?
また、int count_bits(unsigned x)の引数『x』に渡される値はいくつになるのでしょうか?
どなたか解説をお願いいたします。

lang

1/* 2 ビット単位の論理演算 3 */ 4 5#include <stdio.h> 6 7/*--- 整数x中のセットされたビット数を返す ---*/ 8int count_bits(unsigned x) 9{ 10 int bits = 0; 11 while (x) { 12 if (x & 1U) bits++; 13 x >>= 1; 14 } 15 return bits; 16} 17 18/*--- unsigned型のビット数を返す ---*/ 19int int_bits(void) 20{ 21 return count_bits(~0U); 22} 23 24/*--- unsigned型のビット内容を表示 ---*/ 25void print_bits(unsigned x) 26{ 27 int i; 28 for (i = int_bits() - 1; i >= 0; i--) 29 putchar(((x >> i) & 1U) ? '1' : '0'); 30} 31 32int main(void) 33{ 34 unsigned a, b; 35 36 printf("非負の整数を二つ入力してください。¥n"); 37 printf("a : "); scanf("%u", &a); 38 printf("b : "); scanf("%u", &b); 39 40 printf("\na = "); print_bits(a); 41 printf("\nb = "); print_bits(b); 42 printf("\na & b = "); print_bits(a & b); /* aとbの論理積 */ 43 printf("\na | b = "); print_bits(a | b); /* aとbの論理和 */ 44 printf("\na ^ b = "); print_bits(a ^ b); /* aとbの排他的論理和 */ 45 printf("\n~a = "); print_bits(~a); /* aの1の補数 */ 46 printf("\n~b = "); print_bits(~b); /* bの1の補数 */ 47 putchar('\n'); 48 49 return 0; 50}

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

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

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

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

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

guest

回答1

0

ベストアンサー

数字の後のUは、数字が符号無し整数であることを示します。0Uは値としては0と同じです。1U1と同じ。構文上の型が違うだけ。
違いが出てくるのは、大きな数の時。intが4バイト、long intが8バイトだとすると、intで表せる数字範囲は、-2147483648から2147483647です。2147483648と書くとこれはintの範囲を超えているのでlong intつまり8バイトの定数になります。一方、unsigned intで表せる範囲は、0から4294967295なので、2147483648Uunsiged intつまり4バイトの定数になります。

~0Uは、unsiged intが4バイトなら、4バイトの全ビットゼロの1の補数(ビット反転)なので、4バイトの全ビット1、つまり0xFFFFFFFFになります。4294967295Uと同じですね。
この場合、count_bits(~0U)unsiged int型つまり4バイトのビット数つまり32を返します。
sizeof(unsigned int)*8で良いような気もしますが、1バイトが8ビットで無い環境の考慮ですかね。

投稿2015/03/02 17:09

otn

総合スコア84529

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

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

jabu

2015/03/02 17:28

早速のご回答ありがとうございます。 とてもわかりやすい回答でした!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問