CubicLouve

Spring_MTの技術ブログ

Objective-Cのintとlongの最大値は同じという記事をみて

驚愕の事実。Objective-Cのintとlongの最大値は同じだった。 | 三度の飯とエレクトロン

を見て試してみました。

#import <Foundation/NSObject.h>
#import <stdio.h>

int main(void)
{
  int i = INT_MAX;
  NSLog(@"int i: %d", i);
  i++;
  NSLog(@"int i: %d", i);

  long l = (long)INT_MAX;
  NSLog(@"long l: %ld", l);
  l++;
  NSLog(@"long l: %ld", l);

  long long ll = (long long)INT_MAX;
  NSLog(@"long long ll: %lld", ll);
  ll++;
  NSLog(@"longlong ll: %lld", ll);                                                                                                

  return 0;
}
% clang -o long_test LongTest.mm -framework Foundation
% ./long_test
2014-12-08 21:00:57.396 long_test[79790:507] int i: 2147483647
2014-12-08 21:00:57.403 long_test[79790:507] int i: -2147483648
2014-12-08 21:00:57.403 long_test[79790:507] long l: 2147483647
2014-12-08 21:00:57.404 long_test[79790:507] long l: 2147483648
2014-12-08 21:00:57.404 long_test[79790:507] long long ll: 2147483647
2014-12-08 21:00:57.404 long_test[79790:507] longlong ll: 2147483648

ってなったけど、コンパイルするとき、アーキテクチャのデフォルト変わったんじゃないかと思って

% clang -v
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

64ビットやないか。。。

まあ、変わったんだよね、、きっと

32ビットでコンパイルしてみると、

% clang -o long_test LongTest.mm -framework Foundation -arch i386
./long_test
2014-12-08 21:04:29.950 long_test[79849:507] int i: 2147483647
2014-12-08 21:04:29.952 long_test[79849:507] int i: -2147483648
2014-12-08 21:04:29.952 long_test[79849:507] long l: 2147483647
2014-12-08 21:04:29.952 long_test[79849:507] long l: -2147483648
2014-12-08 21:04:29.953 long_test[79849:507] long long ll: 2147483647
2014-12-08 21:04:29.953 long_test[79849:507] longlong ll: 2147483648

オーバーフローしましたね。

まあ、iOS、64ビット化がデフォになるとはいえ、大きい数字使うなら、longじゃなくて、long longつかったほうが無難