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