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

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

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

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

Q&A

解決済

2回答

684閲覧

unsigned int a=3;と宣言した時、unsigned int型の変数に「-aを代入することと、-3を代入すること」の違い

abustoy

総合スコア12

C

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

0グッド

0クリップ

投稿2021/07/29 13:21

編集2021/07/29 15:21

前提・実現したいこと

私の処理系ではint型は4バイトです。
ソースコードにコメントとして質問を記述させていただいております。

/質問1 上の2行の違いについて考えた以下の記述は正しいですか?
まず、-aというのはunsigned int型aに単項演算子-を作用させているのでaの値は4294967293である。よって、上の行はunsigned int型xに値4294967293を代入することを表している。
対して、下の行はunsigned int型yに値-3を代入している。unsigned int型yに負の値を代入しているので、yの値は4294967293である。
/

質問1ですが、書いていることがとても分かりづらいと思いますので、恐縮ですが意味の分からないところがあればお聞きください。

/質問2 下の3行のうち3行目のみ未定義の動作になると思うのですが正しいですか?(1行目と2行目は4294967293に変換指定子uを指定しているが、3行目は負の値-3に変換指定子uを指定していると思いました。)/

該当のソースコード

c

1#include <stdio.h> 2 3int main(void) 4{ 5 unsigned int a=3; 6 7 8 unsigned int x=-a; 9 unsigned int y=-3; 10 /*質問1 上の2行の違いについて考えた以下の記述は正しいですか? 11 まず、-aというのはunsigned int型aに単項演算子-を作用させているのでaの値は4294967293である。よって、上の行はunsigned int型xに値4294967293を代入することを表している。 12 対して、下の行はunsigned int型yに値-3を代入している。unsigned int型yに負の値を代入しているので、yの値は4294967293である。*/ 13 14 15 /*質問2 下の3行のうち3行目のみ未定義の動作になると思うのですが正しいですか?(1行目と2行目は4294967293に変換指定子uを指定しているが、3行目は負の値-3に変換指定子uを指定していると思いました。)*/ 16 printf("%u\n",x); 17 printf("%u\n",-a); 18 printf("%u\n",-3); 19 20 21 22 return 0; 23}

補足情報(FW/ツールのバージョンなど)

cygwinでgccコンパイラを使っております。

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

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

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

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

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

jimbe

2021/07/29 15:00 編集

cのコードの提示の始まりは、「```C言語」では無く「```c」で大丈夫です。 それと、随分勉強をされていらっしゃるようですが、プログラミングで何か問題が起きているということでは無いように見えます。 言語等での定義・正しさを確認されるのであれば、質問では無く、正式とされる関係書籍等に直接当たられるのが確実ではないでしょうか。
jimbe

2021/07/29 15:13

閉じる ``` が足りないようです。 最後の "}" の下に ``` だけの行を入れてみてくださいますか。
abustoy

2021/07/29 15:18

ご指摘ありがとうございます。公式ドキュメント等も探してみます。
abustoy

2021/07/29 15:22

すみません、またご指摘ありがとうございます。これで修正されたと思われます。
jimbe

2021/07/29 15:23

まぁ、特に歴史のあるCの場合はその公式が多数あって、あちこち見ているうちに結局どれが"正しい"になるのかよく分からなくなったりするんですよね >_< ワタシハソノタグイ
jimbe

2021/07/29 15:26

コード部分が枠に入りました。修正ありがとうございます。 入力・修正画面には下部にプレビューもありますので、表示が変かもしれないと思われましたら、プレビューで確認しつつ弄ってみてください。
abustoy

2021/07/29 15:54

修正できてよかったです。はじめたばかりなので、新しく使い方を知れて助かりました、ありがとうございます。
y_waiwai

2021/07/29 22:17

実際にそれを実行してみて、その結果はどうなるんでしょうか
fana

2021/07/30 01:40

> 私の処理系では… という前置きがある時点で,何を問いたいのか謎ですね. あなたの処理系でやってみて確認すればいいだけじゃない? っていう. もしも「Cの公式な規格の上ではどうのこうの」という方面の話を期待しているのであれば, あなたの最近の質問でいろいろとそういった回答が成されているように見えますので, それらで扱った話とこの質問とで何が違うのか? を明確に示してほしいところ.
abustoy

2021/07/30 02:18

y_waiwai様、結果は printf("%u\n",x);、printf("%u\n",-a);、printf("%u\n",-3); いずれも4294967293と出力されました。
abustoy

2021/07/30 03:50 編集

fana様、「私の処理系ではint型は4バイトです。」と前置きしたのは、コード内に出てくる4294967293という数字の意味を明確にするためです。質問2について、私の処理系(cygwinでコンパイラはgcc)ではprintfですべて4294967293と表示されます。 これまで質問した内容とは別の質問です。質問1で私の聞きたいことは、「xでは4294967293という値を代入しようとしている」「yでは-3を代入しようとしている」という違いがあると思うのですが正しいですか?、ということです。「この違いは処理系や規格によって異なるという回答を期待している」わけではありません。
fana

2021/07/30 03:01

> 質問1 というのは,要は, 「一方の側では右辺が "unsigned" int であり,対して他方の側では "signed" int なんじゃねーの?」 っていう話ですか? (そういう話なのであれば,なんというか,こんな感じで,何を "違い" と思っているのか?という対応関係が明確になるように記してほしい.)
abustoy

2021/07/30 03:24 編集

fana様> 「一方の側では右辺が "unsigned" int であり,対して他方の側では "signed" int なんじゃねーの?」 そういう話(の一面もあります)です。ただ「-3」と記述しただけで、signed int型とコンピュータが認識しているのかも疑問(例えばsigned long型の-3と認識するのではという疑問)です。 すみません。このように回答者様の記述から、また新たな疑問が出てきたりして、「違和感は確実に持っているけど明確な質問にできない」というのが今の私の現状ですので、意図のわかりづらい質問を投稿してしまっております。
guest

回答2

0

ベストアンサー

/*質問1 上の2行の違いについて考えた以下の記述は正しいですか?

正しくありません。

まず、-aというのはunsigned int型aに単項演算子-を作用させているのでaの値は4294967293である。

a の値は変更していないので、a の値は 3 です。-a の値が 4294967293 です。

よって、上の行はunsigned int型xに値4294967293を代入することを表している。

宣言における = は、代入演算子ではなく、初期化の構文要素です。
x を 4294967293 で初期化しているのです。

対して、下の行はunsigned int型yに値-3を代入している。

y を -3 で初期化しようとするが、y は unsigned int なので、int の -3 を
unsigned int の 4294967293 に型変換してから y を初期化します。

/*質問2 下の3行のうち3行目のみ未定義の動作になると思うのですが正しいですか?

正しくありません。未定義動作ではありません。

printf は可変個数引数の関数であり、int である -3 は 4バイトのビット表現のまま
printf に渡されます。-3 のビット表現を 16進で表すと 0xfffffffd です。
printf は "%u" という書式指定子に従い 0xffffffd というビット表現を
符号なし整数として、4294967293 という文字列で出力します。

投稿2021/07/30 13:01

編集2021/07/30 13:24
kazuma-s

総合スコア8224

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

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

abustoy

2021/08/01 05:50

ご回答ありがとうございます。初期化の構文要素と、可変子引数の関数について、仕様を確認しようと思います。
guest

0

unsigned int y=-3;

の右辺にある 3 が何型だろうか? と考えると,intであろう.(unsigned int にしたいなら 3u とか書く)

なので,右辺の式 -3 の型はintであろう.

で,yの初期化に際して,それは unsigned int に型変換されて用いられる,という話になるだろう.

…という経緯が x の側とは違いますよね? という話なのであれば,そうだと思います.

投稿2021/07/30 03:24

fana

総合スコア11708

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

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

abustoy

2021/07/30 03:46

ご回答ありがとうございます。質問1を改めて言語化しました。 unsigned int x=-a;のほうは 1...unsigned int 型aに-を適用した-aはunsigned int型で値4294967293を持つ 2...unsigned int 型xにunsigned int 型-aを代入しようとする 3...xも-aもunsigned int型なので問題なく(型変換なく)代入される unsigned int y=-3;のほうは 1...3はint型だとコンピュータが認識して(処理系や規格関係なく)、int型3に-を適用した-3はint型である 2...unsigned int 型yにint型-3を代入しようとする 3...int型-3がunsigned int型に型変換される 4...yも右辺もunsigned int型なので問題なく代入される このプロセスが違いますか?という質問です。 最初からこのように書けばわかりやすかったかもしれません
fana

2021/07/30 04:08 編集

「合っているか間違っているか?」と問いたい時というのは, 話の中のどこかに不安な点があるのだと思うので,一体どこの部分にどんな不安があるのかを示すと良いでしょう.(論点を明確にする)
abustoy

2021/07/30 09:58

その通りに思います。論点を明確にすることを意識するようにいたします。ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問