c言語-型の最大値最小値-

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ユーマ
記事: 22
登録日時: 1年前

c言語-型の最大値最小値-

#1

投稿記事 by ユーマ » 2ヶ月前

こんにちは。
型の最大値や最小値を求めるプログラムを書いていたところ、分岐などはしていないのにも関わらず出力が変化する
という現象が発生したので質問させていただきました。

環境は
Ubuntu 18.04.1 LTS
(GNU Binutils for Ubuntu) 2.30 です。

コード:

#include<stdio.h>

int main(void){
	char c1;
	unsigned char c2;
	short s1;
	unsigned short s2;
	int i1;
	unsigned int i2;
	long l1;
	unsigned long l2;

	c1 |= 0x7f;
	printf("MAX_char = %d\n", c1);
	c1 = ~c1;
	printf("MIN_char = %d\n", c1);

	c2 |= 0xff;
	printf("MAX_Uchar = %d\n", c2);
	c2 = ~c2;
	printf("MIN_Uchar = %d\n", c2);

	s1 |= 0x7fff;
	printf("MAX_short = %d\n", s1);
	s1 = ~s1;
	printf("MIN_short = %d\n", s1);

	s2 |= 0xffff;
	printf("MAX_Ushort = %d\n", s2);
	s2 = ~s2;
	printf("MIN_Ushort = %d\n", s2);

	i1 |= 0x7fffffff;
	printf("MAX_int = %d\n", i1);
	i1 = ~i1;
	printf("MAX_int = %d\n", i1);

	l1 |= 0x7fffffff;
	printf("MAX_long = %ld\n", l1);
	l1 = ~l1;
	printf("MIN_long = %ld\n", l1);

	return 0;
}
このようなプログラムなんですが、
gcc test.c -o test (test.cがこのプログラム)
./test
で実行すると毎回結果が変わります。

実行結果をのせます。
MAX_char = 127
MIN_char = -128
MAX_Uchar = 255
MIN_Uchar = 0
MAX_short = 32767
MIN_short = -32768
MAX_Ushort = 65535
MIN_Ushort = 0
MAX_int = -1
MAX_int = 0
MAX_long = 2147483647
MIN_long = -2147483648
ここではintに関しては思うように動いていませんがもう一度実行すると
MAX_char = 127
MIN_char = -128
MAX_Uchar = 255
MIN_Uchar = 0
MAX_short = 32767
MIN_short = -32768
MAX_Ushort = 65535
MIN_Ushort = 0
MAX_int = 2147483647
MAX_int = -2147483648
MAX_long = 2147483647
MIN_long = -2147483648
と意図した結果になることになることもあります。

ほかにもcharのところも値がぶれます。

自分はなにかとんでもなく変なことをしているのでしょうか?
なぜこうなるかお分かりの方がいらっしゃいましたらよろしくお願いいたします。

ユーマ
記事: 22
登録日時: 1年前

Re: c言語-型の最大値最小値-

#2

投稿記事 by ユーマ » 2ヶ月前

すみません。質問者です。追加の情報失礼します。
型だけではsignedかunsignedか環境によって変わって来るらしいので追記しました。

コード:

	signed char c1;
	unsigned char c2;
	signed short s1;
	unsigned short s2;
	signed int i1;
	unsigned int i2;
	signed long l1;
	unsigned long l2;

かずま

Re: c言語-型の最大値最小値-

#3

投稿記事 by かずま » 2ヶ月前

ユーマ さんが書きました:
2ヶ月前

コード:

int main(void){
	char c1;
	
	c1 |= 0x7f;
自分はなにかとんでもなく変なことをしているのでしょうか?
なぜこうなるかお分かりの方がいらっしゃいましたらよろしくお願いいたします。
未初期化変数の値を使って計算をしています。
char c1 = 0; とするか、または c1 = 07f; としましょう。

かずま

Re: c言語-型の最大値最小値-

#4

投稿記事 by かずま » 2ヶ月前

かずま さんが書きました:
2ヶ月前
char c1 = 0; とするか、または c1 = 07f; としましょう。
c1 = 0x7f; ですね。

それから、処理系によっては long が 64ビットのこともありますよ。

ユーマ
記事: 22
登録日時: 1年前

Re: c言語-型の最大値最小値-

#5

投稿記事 by ユーマ » 2ヶ月前

かずまさんありがとうございます!
初期化をするのを忘れていたんですね..恥ずかしい;;
c1 = 0x7fなど初期化してから実行すると思った通りに動きました!
longも処理系によっては大きさが違ったりするんですね...
ありがとうございました!

返信

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