Dev C 下關於char型別的實驗

2021-03-31 14:52:32 字數 2013 閱讀 7540

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...