1.標示符名稱的限制
ANSI C標準只保證了C實現必須能夠
區別出前6個字符不同的外部名稱。而且這個定義中并
沒有區分大寫字母與其對應的小寫字母。因此,編寫可移植程序必須小心這一點。
2.字符是有符號的整數,還是無符號的整數
只有把一個字符值轉換
為一個較大的整數時,才重要。在其他情況下,結果都是:多余的位被簡單的“丟棄”。
在轉換過程中:應該將字符作為有符號數還是無符號數?
如果有符號,編譯器將char數據,擴展到int時候,應該復制符號位。
如果無符號,編譯器只需在多余的位上填充0.
#include <stdio.h>
int main()
{
char c='a';
c=c+40;
// printf("%c\n", -1);
printf("c %d\n", c);
printf("unsigned c %u\n", (unsigned char)c);
}
結果:
c -119
unsigned c 137
說明在gcc中,將char當做有符號數。在c+40的時候,超過了-128~127范圍,因此溢出。如果是無符號char,范圍是0~255.應該是輸出137.
如果編程者關注一個最高位是1的字符是正還是負,可以設置
為無符號字符數。這樣所有編譯器都會轉換為整數時候,填充為0.
3.一個常見錯誤是:如果c是一個字符變量,使用(unsigned)c可以得到與c等價的無符號整數。
這是會失敗的。因為在將c轉換為無符號整數時候,c將首先首先被轉換為int型整數。而此時可能得到非預期的結果。
正確方法是:(unsigned char )c,直接進行轉換。
例如上個例子中,最后一句改為:
printf("unsigned c %u\n", (unsigned )c);
那么結果是:
c -119
unsigned c 4294967177
c被先轉換為int型-119,再求他的無符號表達形式,
4294967177 4.移位運算符
1.向右移位時,空出的位由0填充,還是由符號位的副本填充。
2.如果是無符號數,用0填充。如果是有符號數,既可以用0也可以用符號位的副本。(如果關注右移時候空出的位,可以聲明為無符號類型,那么空出的位都會被設置為0)
如果被移位對象為n位,那么移位計數
必須大于或等于0,而嚴格小于n.即使C實現將符號位復制到空出的位中,有符號數的向右移位,
也并不等于除以2的某次冪。例如(-1)>>1結果為-1,而不是-1/2 == 0
5.隨機數最大值,RAND_MAX在limits中定義。我測試結果等于INT_MAX
6.除法運算的截斷
q=a/b;
r=a%b;
假定b>0.
C語言定義只保證q*b+r=a,以及a>=0 且 b>0時,保證|r|<|b|以及r>=0.(如果a<0, 那么
r也可能小于0)例如:
int main() {
// Start typing your code here
cout<<(-3)/2<<endl;
return 0;
}
結果商為-1,余數也為-1