#include<stdio.h>
int main()
{char a = -1 ;signed char b = -1 ;unsigned char c = -1 ;printf ("a = %d, b = %d, c = %d" , a, b, c);return 0 ;
}
???? 1000 0000 0000 0001 -> -1源碼
????1111 1111 1111 1110 -> -1反碼
????1111 1111 1111 1111 -> -1補碼
????對于a,按位提升,看的是當前比特位的類型,所以按位提升將變為1111 1111 1111 1111 1111 1111 1111 1111,而輸出的時候先看類型和最高位,類型是有符號char,由于最高位是1,所以必須將此時的補碼1111 1111轉換為源碼,在進行讀取,此時對應的源碼是1000 0001,對應的二進制數字是-1,對于b,輸出的和a是一樣的,這里不在多說。而對于c來說,它對應的當前變量的類型是無符號char類型,而讀的時候是以%d的形式輸出,所以將1111 1111轉換為二進制,對應的數字是255,所以輸出的結果如圖所示。
#include<stdio.h>
int main()
{char a = -128 ;printf ("%u\n" , a);return 0 ;
}
????-128對應的二進制比特為是1000 0000,當以%u的形式輸出的時候,先進行比特位按位提升,1111 1111 1111 1111 1111 1111 1000 0000,按照%u輸出就會成為一個特別大的數字
#include<stdio.h>
int main()
{char a = 128 ;printf ("%u\n" , a);return 0 ;
}
????128對應的二進制比特位是1000 0000,它的類型是有符號char類型,輸出以%u輸出,此時先進行比特位提升1111 1111 1111 1111 1111 1111 1000 0000,而輸出是以%u輸出,此時應該是一個非常大的數
#include<stdio.h>
int main()
{int i = -20 ;unsigned int j = 10 ;printf ("%d\n" , i + j);return 0 ;
}
????i對應的二進制補碼是1111 1111 1111 1111 1111 1111 1110 1100 ,10是無符號整型,對應的二進制是0000 0000 0000 0000 0000 0000 0000 1010,將i和j相加得到1111 1111 1111 1111 1111 1111 1111 0110,輸出是以%d的形式輸出,則將二進制對應的補碼轉換為原碼是1000 0000 0000 0000 0000 0000 0000 1010,將其輸出對應的十進制數是-10
#include<stdio.h>
int main()
{unsigned i;for (i = 9 ; i >= 0 ; i--){printf ("%u\n" , i);}return 0 ;
}
???? 這里的i是一個無符號int型數據,所以在它的眼里所有的數據都是大于零的,所以程序自然會進入死循環中
#include<stdio.h>
#include<string.h>
int main()
{char a[1000 ];int i;for (i = 0 ; i < 1000 ; i++){a[i] = -1 - i;}printf ("%d" , strlen (a));return 0 ;
}
????a[i]先是由-1到-128;當i變成128時此時-1-128賦值給a[i],而a[i]是一個有符號char類型,此時-1和-128相加,在a[i]的眼里將變成127, 繼續加則是126,直到0,則對應的字符有128 + 128 = 256,但是字符串是以’\0’結尾,此時的0將不算入其中,則總共有255個字符
#include<stdio.h>
int main()
{short num = 32767 ;short int a = num + 1 ;printf ("%d" , a);return 0 ;
}
????32767對應的二進制原碼是0111 1111 1111 1111,當給其加1時變成 1000 0000 0000 0000,然后以%d輸出,先進行符號擴展,a是有符號短整型,符號擴展為1111 1111 1111 1111 1000 0000 0000 0000,而符號位是1,轉換為原碼是1000 0000 0000 0000 1000 0000 0000 0000,所以輸出是-32769
#include<stdio.h>
unsigned char i = 0 ;
int main()
{for (i = 0 ; i <= 255 ; i++){printf ("hello, world\n" );}return 0 ;
}
????i的類型是無符號char,范圍是0到255,所以死循環