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つかったほうが無難