QA@IT
«質問へ戻る

結果だけ新しくてソースが古いままでした。

104
本文
   PRINT_VALUE(-2147483648);
   PRINT_VALUE(-0x80000000);
   PRINT_VALUE(-0x80000000l);
+  int v = -2147483648;
+  PRINT_VALUE(v);
+  v = -0x80000000;
+  PRINT_VALUE(v);
   return -0x80000000 == -2147483648 ? 0 : 1;
 }
 ```

C++で同じ値が表記によって型が変わることがある?

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

  • 整数リテラル -0x80000000
  • 整数リテラル -2147483648
  • std::numeric_limits<int>::min() の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  int v = -2147483648;
  PRINT_VALUE(v);
  v = -0x80000000;
  PRINT_VALUE(v);
  return -0x80000000 == -2147483648 ? 0 : 1;
}

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
v: i(-2147483648)
v: i(-2147483648)
[1]    35925 exit 1     ./a

私は-2147483648-0x80000000もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため-2147483648-0x80000000を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)

こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

* 整数リテラル `-0x80000000`
* 整数リテラル `-2147483648`
* `std::numeric_limits<int>::min()` の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

```
#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  int v = -2147483648;
  PRINT_VALUE(v);
  v = -0x80000000;
  PRINT_VALUE(v);
  return -0x80000000 == -2147483648 ? 0 : 1;
}
```

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
v: i(-2147483648)
v: i(-2147483648)
[1]    35925 exit 1     ./a
```

私は`-2147483648`も`-0x80000000`もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため`-2147483648`と`-0x80000000`を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)
```
こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。

一つ目の実行結果が古かったので差し替えました。

104
本文
 -2147483648: l(-2147483648)
 -0x80000000: j(2147483648)
 -0x80000000l: l(-2147483648)
-[1] 33544 exit 1 ./a
+v: i(-2147483648)
+v: i(-2147483648)
+[1]    35925 exit 1     ./a
 ```
 
 私は`-2147483648`も`-0x80000000`もi(int)とみなされると理解していましたが、

C++で同じ値が表記によって型が変わることがある?

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

  • 整数リテラル -0x80000000
  • 整数リテラル -2147483648
  • std::numeric_limits<int>::min() の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  return -0x80000000 == -2147483648 ? 0 : 1;
}

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
v: i(-2147483648)
v: i(-2147483648)
[1]    35925 exit 1     ./a

私は-2147483648-0x80000000もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため-2147483648-0x80000000を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)

こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

* 整数リテラル `-0x80000000`
* 整数リテラル `-2147483648`
* `std::numeric_limits<int>::min()` の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

```
#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  return -0x80000000 == -2147483648 ? 0 : 1;
}
```

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
v: i(-2147483648)
v: i(-2147483648)
[1]    35925 exit 1     ./a
```

私は`-2147483648`も`-0x80000000`もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため`-2147483648`と`-0x80000000`を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)
```
こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。

質問を投稿

C++で同じ値が表記によって型が変わることがある?

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

  • 整数リテラル -0x80000000
  • 整数リテラル -2147483648
  • std::numeric_limits<int>::min() の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  return -0x80000000 == -2147483648 ? 0 : 1;
}

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
[1] 33544 exit 1 ./a

私は-2147483648-0x80000000もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため-2147483648-0x80000000を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL

int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)

こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。

Mac OS X 10.7でg++(4.2.1と4.7.2)やclang++ 4.2を使って64bitバイナリを作っています。

このような環境において、

* 整数リテラル `-0x80000000`
* 整数リテラル `-2147483648`
* `std::numeric_limits<int>::min()` の戻り値

以上3つは同じ値を表しているものと理解していますが、
この3つがそれぞれ型が異なるような結果が得られてしまいます。
これはこういうものなのでしょうか?

試しに以下のようなソースを書きました:

```
#include <iostream>
#include <limits>
#include <typeinfo>
#define PRINT_TYPE(x) std::cout << #x << ": " << typeid(x).name() << std::endl
#define PRINT_VALUE(x) std::cout << #x << ": " << typeid(x).name() << "(" << x << ")" <<std::endl
int main()
{
  PRINT_TYPE(int);
  PRINT_TYPE(long int);
  PRINT_TYPE(long long int);
  PRINT_TYPE(unsigned int);
  PRINT_TYPE(unsigned long int);
  PRINT_TYPE(unsigned long long int);
  PRINT_VALUE(std::numeric_limits<int>::min());
  PRINT_VALUE(std::numeric_limits<int>::max());
  PRINT_VALUE(-2147483648);
  PRINT_VALUE(-0x80000000);
  PRINT_VALUE(-0x80000000l);
  return -0x80000000 == -2147483648 ? 0 : 1;
}
```

私の環境(Mac OS X 10.7、g++ 4.2.1 or g++ 4.7.2 or clang++ 4.2.1)でのコンパイル結果は次のとおりです:
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: l(-2147483648)
-0x80000000: j(2147483648)
-0x80000000l: l(-2147483648)
[1] 33544 exit 1 ./a
```

私は`-2147483648`も`-0x80000000`もi(int)とみなされると理解していましたが、
それぞれl(long int)、j(unsigned int)とみなされています。
そのため`-2147483648`と`-0x80000000`を比較しても一致しません(違う値と見なされているため)。

念の為ideoneでも実行してみました:
http://ideone.com/ErUnhL
```
int: i
long int: l
long long int: x
unsigned int: j
unsigned long int: m
unsigned long long int: y
std::numeric_limits<int>::min(): i(-2147483648)
std::numeric_limits<int>::max(): i(2147483647)
-2147483648: m(2147483648)
-0x80000000: j(2147483648)
-0x80000000l: m(2147483648)
v: i(-2147483648)
v: i(-2147483648)
```
こちらはリテラルがそれぞれm(unsigned long int)、j(unsigned int)のように両方共unsignedと見なされています。