こんにちは。
型の最大値や最小値を求めるプログラムを書いていたところ、分岐などはしていないのにも関わらず出力が変化する
という現象が発生したので質問させていただきました。
環境は
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のところも値がぶれます。
自分はなにかとんでもなく変なことをしているのでしょうか?
なぜこうなるかお分かりの方がいらっしゃいましたらよろしくお願いいたします。