給定一個 32 位有符號整數,將整數中的數字進行反轉。spa
示例 1:指針
輸入: 123 輸出: 321
示例 2:code
輸入: -123 輸出: -321
示例 3:blog
輸入: 120 輸出: 21
利用 / 和 % 進行運算。好比 123 -> 321 編譯器
123/10=12it
123%10=3io
設temp=0;編譯
x=123;class
第一次循環:cli
temp=temp*10+x%10
=3
x=x/10
=12
第二次循環:
temp =3*10+2
=32
x=1
第三次循環:
temp=321
x=1/10=0;
c語言中1%10=1怎麼理解? %在C語言中是一個取餘數的符號 在本題中1%10就是1/10後取餘數,而1不夠除以10,因此取商等於0,根據餘數=被除數-除數*商=1-10*0=1,即得餘數爲一 因此輸出1
因此當x=0時 ,輸出temp 即爲翻轉數。
1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int reverse(int x); 7 int num ,reverseNum; 8 scanf("%d",&num); 9 reverseNum=reverse(num); 10 printf("%d", reverseNum); 11 system("pause"); 12 return 0; 13 } 14 15 int reverse(int x) 16 { 17 int temp=0; 18 while(x%10!=0||x/10!=0) 19 { 20 if(temp<-214748364||temp>214748364) 21 { 22 return 0; 23 24 } 25 temp=temp*10+x%10; 26 x=x/10; 27 } 28 return temp; 29 }
對於正數,反碼,補碼與原碼相同。
對於負數,補碼是原碼的符號位不變,數值部分按位取反再加1。
short型數據是16位表示最高位是符號位,因此只有15位表示數值,15位000000000000000-111111111111111表示的範圍是0-32767,又加上最高位的符號位(第16位),就能夠表示-32768-32767 。unsigned short型數據是16位都用來表示數值,16位0000000000000000-1111111111111111表示的範圍是0-65535。
計算機在進行計算時是用補數計算的,且若是溢出會進行丟位處理。如short型32767補碼是0111111111111111 加1後爲1000000000000000(注意最高位是符號位),1000000000000000正是-32768的補數。
而unsigned short型數據無符號65535爲1111111111111111(16位),加1後爲10000000000000000(17位)這時計算機判斷溢出後丟棄第17位,變爲0000000000000000就是0了
《C和指針》中寫過:long與int:標準只規定long不小於int的長度,int不小於short的長度。
double與int類型的存儲機制不一樣,long int的8個字節所有都是數據位,而double是以尾數,底數,指數的形式表示的,相似科學計數法,所以double比int能表示的數據範圍更廣。
long long在win32中是確實存在,長度爲8個字節;定義爲LONG64。
爲何會出現long int呢?在win32如今系統中,長度爲4;在歷史上,或者其餘某些系統中,int長度爲2,是short int。
即使是long long,在TI的有款平臺中,長度爲5也就是說,每種類型長度,須要sizeof才知道,若是可能,最好用union看看裏面的數據,能夠消除一些類型的假象長度。
類型名稱 字節數 取值範圍
signed char 1 -128~+127 short int 2 -32768~+32767 int 4 -2147483648~+2147483647 long int 4 -2147483648~+2141483647 long long long int 8 -9223372036854775808~+9223372036854775807
unsigned int (unsigned long) 4字節8位可表達位數:2^32=42 9496 7296 範圍:0 ~ 42 9496 7295 (42*10^8) int (long) 4字節8位可表達位數:2^32=42 9496 7296 範圍:-21 4748 3648 ~ 21 4748 3647 (21*10^8) long long (__int64) 8字節8位可表達位數:2^64=1844 6744 0737 0960 0000 範圍:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16) unsigned long (unsigned __int64) 8字節8位可表達位數:2^64=1844 6744 0737 0960 0000 範圍:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)
在#include<climits>存有各個類型的最大值和最小值 CHAR_MIN char的最小值 SCHAR_MAX signed char 最大值 SCHAR_MIN signed char 最小值 UCHAR_MAX unsigned char 最大值 SHRT_MAX short 最大值 SHRT_MIN short 最小值 USHRT_MAX unsigned short 最大值 INT_MAX int 最大值 INT_MIN int 最小值 UINT_MAX unsigned int 最大值 UINT_MIN unsigned int 最小值 LONG_MAX long最大值 LONG_MIN long最小值 ULONG_MAX unsigned long 最大值 FLT_MANT_DIG float 類型的尾數 FLT_DIG float 類型的最少有效數字位數 FLT_MIN_10_EXP 帶有所有有效數的float類型的負指數的最小值(以10爲底) FLT_MAX_10_EXP float類型的正指數的最大值(以10爲底) FLT_MIN 保留所有精度的float類型正數最小值 FLT_MAX float類型正數最大值
本身推算:
以int類型爲例:
int爲4字節32位,其中首位用0表示正數,用1表示爲負數。所以對於
最大正數能夠表示爲:0x7fff ffff(7的二進制爲0111,f二進制爲1111)
最大負數(-1)能夠表示爲:0xffff ffff
最小負數能夠表示爲:0x8000 0000(8的二進制爲1000)
INT_MIN在標準頭文件limits.h中定義。
1 #define INT_MAX 2147483647
2 #define INT_MIN (-INT_MAX - 1)//這裏沒有簡單地將INT_MIN賦值成-2147483647,是由於-2147483648對於編譯器而言是個表達式,而2147483648對於32-bit整數是沒法表示的,
因此通過這個表達式的結果是未定義的。在GCC上直接寫-2147483648後,編譯器給出了警告,說結果是unsigned。
在C/C++語言中,不可以直接使用-2147483648來代替最小負數,由於這不是一個數字,而是一個表達式。表達式的意思是對整數21473648取負,可是2147483648已經溢出了int的上限,因此定義爲(-INT_MAX -1)。
C中int類型是32位的,範圍是-2147483648到2147483647 。 (1)最輕微的上溢是INT_MAX + 1 :結果是 INT_MIN; (2)最嚴重的上溢是INT_MAX + INT_MAX :結果是-2; (3)最輕微的下溢是INT_MIN - 1:結果是是INT_MAX; (4)最嚴重的下溢是INT_MIN + INT_MIN:結果是0 。