来源:www.cncfan.com | 2006-4-28 | (有4974人读过)
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++) { printf("# %d\n", i); printf("%d\n", v_char); /* No.1 */ printf("%u\n", v_char); /* No.2 */ printf("%d\n", (int)v_char); /* No.3 */ printf("%u\n", (unsigned int)v_char); /* No.4 */ printf("%d\n", (unsigned char)v_char); /* No.5 */ printf("%u\n", (unsigned char)v_char); /* No.6 */ printf("\n"); v_char++; }
若定义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 <stdio.h>
int main() { freopen("out.txt", "wb", stdout);
putchar('\r'); putchar('\n'); return 0; }
No.2 —— 两个不可识别字符0AH,0DH
#include <stdio.h>
int main() { freopen("out.txt", "wb", stdout);
putchar('\n'); putchar('\r'); return 0; }
No.3 —— 一个不可识别字符0DH
#include <stdio.h>
int main() { freopen("out.txt", "wb", stdout);
putchar('\r'); return 0; }
No.4 —— 一个不可识别字符0AH
#include <stdio.h>
int main() { freopen("out.txt", "wb", stdout);
putchar('\n'); return 0; }
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++会给出警告,不建议这样使用.
|