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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值