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++会给出警告,不建议这样使用.