kingwei 2005.3.11
實驗環境: windows xp, dev-c++ 4.9.6.0 (gcc/mingw32)
1. 關於char的數值輸出
v_char = 0;
for (i=0; i<256; i++)
若定義v_char為unsigned char,上面這6種方式均可正常工作.
但是,如果v_char是char或signed char,
當v_char的值為0~127時,上面這6種方式也可正常工作.
當v_char的值為128~255時,只有第5,6兩種能夠正常工作.
第1,3方式的結果是一樣的:
值 輸出
128 -128
129 -127..
.254 -2
255 -1
第2,4方式的結果是一樣的:
值 輸出
128 4294967168
129 4294967169..
.254 4294967294
255 4294967295
這是因為將1位元組的signed char轉換為4位元組的int時,對最高符號位1進行了擴充套件,而造成的.
所以,如果要處理的資料中存在位元組值大於127的情況,還是用unsigned char較為妥當.
程式中若涉及位運算,也應該使用unsigned型變數.
高位符號擴充套件引起的運算問題往往是防不勝防.
2. 關於回車換行符
一般來說,按下鍵盤上的enter鍵,將產生兩個字元:
cr(carriage return: 回車) ascii碼 = 13 = 0dh 轉義符 = '/r'
lf(line feed: 換行) ascii碼 = 10 = 0ah 轉義符 = '/n'
cr在前,lf在後.
比如你開啟記事本,按下enter,儲存之後,檢視屬性,檔案長度為2位元組.
就是這個原因.
c中,輸入輸出有兩種模式: 文字方式和二進位制方式
對應檔案開啟(fopen/freopen)時的描述字串為:
i/o方式 輸入 輸出
文字方式 "r" "w"
二進位制方式 "rb" "wb"
預設的控制台i/o——stdin,stdout,使用的是文字方式.
文字方式下,按下enter鍵,getchar()或scanf("%c", &ch)讀到的只是後乙個字元'/n';
而使用conio.h中的getch(),讀到的卻是前乙個字元'/r'.
輸出時,printf("/n")或putchar('/n')產生的卻是兩個字元:'/r'和'/n';
而printf("/r")或putchar('/r')產生的只是乙個'/r',若輸出到檔案,
用記事本開啟後可以看到乙個小方塊——不可識別字元0dh.
二進位制方式下,輸入輸出時,乙個字元就是乙個字元.
因此,讓我們試試下面這幾段程式:
no.1 —— ok!
#include
int main()
no.2 —— 兩個不可識別字元0ah,0dh
#include
int main()
no.3 —— 乙個不可識別字元0dh
#include
int main()
no.4 —— 乙個不可識別字元0ah
#include
int main()
3. 其它
dev-c++下:
1 char型資料長度為1位元組.
2 char預設為有符號型,即signed char.但並不是所有編譯器都這樣處理.
3 取值範圍:
signed char 0 ~ 255
unsigned char -128 ~ 127
4 輸出時,使用格式符%c,即按字元方式輸出;或使用%d,%u,%x,%o按整數方式輸出.
5 輸入時,應使用%c,即按字元方式輸入;若使用整數方式,dev-c++會給出警告,不建議這樣使用.
Dev C 下關於幾種int型別格式符的實驗
kingwei 2005.3.10 實驗環境 dev c 4.9.6.0 gcc mingw32 使用 wall編譯選項 include int main 測試樣例及輸出 test case 1 下界 2147483648 2147483648 0 32768 0 2147483648 0outpu...
char 與char 型別的區別
參考文章 char s 和 char s 的區別小結 char s1 hello char s2 hello 區別所在 char s1 的s1是指標變數,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,但當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char ...
關於char 與char 的區別
char a在執行時賦值,值會從靜態區賦值到函式的棧中,對它進行修改不會產生任何問題。char a在編譯時就確定了,a指向靜態區中的值,沒有賦值到函式棧中,因此對指標的內容進行修改會產生錯誤。和許多文章一樣,還是先來了解一下 乙個由 c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stac...