練習一
//輸出是什么?
#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;
}
-1,-1,255
解釋:無符號數-1在記憶體中的存盤二進制(補碼)序列為1111 1111
練習二
//輸出是什么?
#include <stdio.h>
int main()
{
char a = -128; //記憶體中存盤的二進制序列是10000000
printf("%u\n",a);
return 0;
}
4294967168
解釋:規定-128二進制序列為1000 0000, 無符號整形輸出的二進制序列是1111 1111 1111 1111 1111 1111 1000 0000
練習三
//輸出是什么?
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
4294967168
解釋:char型別的128存盤的二進制為1111 1111 1111 1111 1111 1111 1000 0000
練習四
int i= -20; //存盤為補碼 1111 1111 1111 1111 1111 1111 1110 1100
unsigned int j = 10; //存盤為補碼 0000 0000 0000 0000 0000 0000 0000 1010
printf("%d\n", i+j); // 1111 1111 1111 1111 1111 1111 1111 0110 原碼
// 1000 0000 0000 0000 0000 0000 0000 1010 補碼 -10
//按照補碼的形式進行運算,最后格式化成為有符號整數
輸出為-10
練習五
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
程式運行為死回圈,
解釋:存在隱式轉換,--i 為0時,無符號整型無負數,--i =4294967295(最大int值),然后 --i 一直執行直到 i = 0 …… 重復操作
練習六
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
輸出結果255
解釋:char型別,當 a[i] 減小到-128時越界,開始從最大值127減小,一直減小到0,strlen識別到的是’\0’,strlen不將0計入總長, 128+128-1=255
練習七
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
輸出結果為hello world死回圈
解釋:無符號char型別只有8個位元位,表示數的最大值為255,當 i 的值從 0 加至 255 時,再加1會發生截斷,i 變為0 ,從0開始反復操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304534.html
標籤:其他
