因為%u是對應於無符號整型資料,-1這個數本身是隻存在於有符號數值型別中的,將它強制轉換為無符號型別的時候就出現了向下越界,於是就變成了你看到的4294967295。
至於為什麼是4294967295這個數,就要從整型數值在記憶體中的儲存形式說起了。
一個32位的整型數值在記憶體中就是由32個01組成的,運用簡單的數學知識即可知道,32個0或1一共有2^32種組合形式,也就是對應了2^32個數。
無符號的情況很好理解,這2^32個數,就是從0到2^32-1的所有整數,而2^32-1是多少?就是它:4294967295,它在記憶體中就是32個1。
有符號的情況下,C語言規定這32個01表示的是從-2^16到2^16-1,0被分到了正數這一邊。很容易知道,0在記憶體中就是32個0,剩下的所有正整數都是對應於二進位制直接儲存在32個01裡。
而負數的表示呢,其實也很簡單,假想在32個01最前面再加個1,變成33位。此時的0就對應於二進位制1000...000,它減一就等於二進位制0111...111,也就是-1了。
所以這個時候就能看到,有符號的-1和無符號的4294967295在記憶體中都是32個1,然後就出現了題目中描述的情況了。
因為%u是對應於無符號整型資料,-1這個數本身是隻存在於有符號數值型別中的,將它強制轉換為無符號型別的時候就出現了向下越界,於是就變成了你看到的4294967295。
至於為什麼是4294967295這個數,就要從整型數值在記憶體中的儲存形式說起了。
一個32位的整型數值在記憶體中就是由32個01組成的,運用簡單的數學知識即可知道,32個0或1一共有2^32種組合形式,也就是對應了2^32個數。
無符號的情況很好理解,這2^32個數,就是從0到2^32-1的所有整數,而2^32-1是多少?就是它:4294967295,它在記憶體中就是32個1。
有符號的情況下,C語言規定這32個01表示的是從-2^16到2^16-1,0被分到了正數這一邊。很容易知道,0在記憶體中就是32個0,剩下的所有正整數都是對應於二進位制直接儲存在32個01裡。
而負數的表示呢,其實也很簡單,假想在32個01最前面再加個1,變成33位。此時的0就對應於二進位制1000...000,它減一就等於二進位制0111...111,也就是-1了。
所以這個時候就能看到,有符號的-1和無符號的4294967295在記憶體中都是32個1,然後就出現了題目中描述的情況了。