电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C++/VC>>Dev-C++下关于char类型的实验:

Dev-C++下关于char类型的实验

来源:www.cncfan.com | 2006-4-28 | (有4820人读过)

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

C++/VC热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号