範圍
int類型範圍爲[-2^31,2^31),即-2147483648~2147483647,unsigned類型範圍爲[0,2^32),即0~2147483648,當需要表示的整數小於10位時可以使用。
當需要表示的整數大於10位時,使用int類型將會出現溢出,此時可以使用_int64類型。_int64類型範圍爲[-2^63,2^63),即-9223372036854775808~9223372036854775807,可以表示19位以下的整數,unsigned _int64範圍爲[0,2^64),即0~18446744073709551616,可以表示20位以下的正整數。
類型轉換
將一個int類型的對象賦值給_int64類型對象時,將會對int進行類型轉換。需要注意的是以下情況:
#include<stdio.h>
void main(){
_int64 a = -sizeof(int);
printf("%I64d\n",a);
}
輸出爲:
4294967292
Press any key to continue
原因是在編譯階段,-sizeof(int)被當成一個32位的整形對待,二進制表示爲:1111 1111 1111 1111 1111 1111 1111 1100(-4的二進制表示)。而__int64是一個64位的,所以完全可以把1111 1111 1111 1111 1111 1111 1111 1100存放下來,而不發生數據截斷。所以此時1111 1111 1111 1111 1111 1111 1111 1100被解釋成4294967292,而不是-4!
參考:http://www.cnblogs.com/chenkunyun/archive/2012/05/17/2506169.html
輸入輸出
輸入輸出需要使用c標準的輸入輸出方式,不能使用cin>>作爲輸入,標準方式如下:
#include<stdio.h>
void main(){
_int64 a;
scanf("%I64d",&a);
printf("%I64d\n",a);
}
需要注意如果使用了scanf("%d",&a)作爲輸入或者使用printf("%d",a)作爲輸出將會發生錯誤!
注意事項
- __int64關鍵字和I64標號確實是MS專有的。標準C用long long和%lld。所以在Unix、Linux、Cygwin下編程就應該用標準的用法了。
- 在32 位Intel 計算機上分配64 位值不是原子操作;即該操作不是線程安全的,多線程讀寫必須加鎖,類似於double類型。這意味着,如果兩個人同時將一個值分配給一個靜態_Int64 字段,則該字段的最終值是無法預測的。
- _int64不能用作爲循環變量
參考:
http://tangfeng.iteye.com/blog/421653
http://www.cnitblog.com/cockerel/archive/2006/08/16/15356.html
http://baike.baidu.com/view/1235293.htm
http://topic.csdn.net/u/20101217/14/05cb2e93-03e9-4f77-be65-9241393c1df3.html