テキストを読んでいて理解できない箇所があります。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
lily

テキストを読んでいて理解できない箇所があります。

#1

投稿記事 by lily » 6年前

コード:

#include<stdio.h>

int main(void){
char a=127,b=128;

printf("%5d %5d %5d \n",a,a+1,b);
printf("%5d %5d %5d %5d\n",a,a+=1,b,a);
return 0;
}
output:
127 128 -128
127 -128 -128 -128

この場合、char型で宣言したのに%dで出力するのはいいのでしょうか?
この出力の-128になる部分はなぜ-128になるのでしょうか?

初歩的な質問ですが、よろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テキストを読んでいて理解できない箇所があります。

#2

投稿記事 by みけCAT » 6年前

lily さんが書きました:この場合、char型で宣言したのに%dで出力するのはいいのでしょうか?
printf(など)の型が与えられていない可変個の引数の部分では、integer promotionによりchar型のデータはint型に変換されるので、大丈夫です。
(N1570 6.3.1.1 Boolean, characters, and integersの2、6.5.2.2 Function callsの6)
lily さんが書きました:この出力の-128になる部分はなぜ-128になるのでしょうか?
このコードは
・符号付き整数のオーバーフロー
・値の更新と参照の順序が確定しない
という未定義動作があるので、出力されたアセンブリ言語を読むなどしないとなぜこの環境で-128になるのかの説明は難しいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

lily

Re: テキストを読んでいて理解できない箇所があります。

#3

投稿記事 by lily » 6年前

解答ありがとうございます。
オーバーフローというのはchar型が符号付き整数127までしか格納できないから代わりに-128が出力されたということでしょうか?
本当に無知で聞くのも心苦しいのですが、なぜa+1の部分は128と出力されているのにa+=1の部分は-128なのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: テキストを読んでいて理解できない箇所があります。

#4

投稿記事 by みけCAT » 6年前

a+1 (N1.5.7.0 6.5.6 Additive operators) は、両辺が算術型(ポインタではない)の時はusual arithmetic conversions (N1570 6.3.1.8)を両辺に適用してから計算を行うので、
int型どうしの計算になり、int型は少なくとも-32767~32767は表せるので128になります。

a+=1 (6.5.16.2 Compound assignment) は、代入演算子の定義より代入後のaの値になります。
char型が2の補数で表される8ビット符号付き整数であれば、127、すなわち2進数の01111111に1を足すと10000000となり、
負の数(最上位ビットが1)かつ128を足すと0になる数、すなわち-128になることが予想できます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

lily

Re: テキストを読んでいて理解できない箇所があります。

#5

投稿記事 by lily » 6年前

何とか理解できました。ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る