(笔记)从一道笔试题看字符型数据

本文通过一道笔试题探讨C语言中的字符型常量和变量,详细解释转义字符的作用,说明字符数据在内存中以ASCII代码形式存储,并讨论字符数据在不同开发平台上的有符号性和无符号性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔试题

//求输出结果
int main()
{
       char a[1000];
       int i;
       for(i = 0; i<1000;i++)
       {
            a[i] = -1 – i;
       }
       printf(“%d\n”,strlen(a)) ;
       return 0;    
}
//a[i]为char型数据,取值范围: -128 ~ +127
//所以:经过128次循环后 a[127] = -128,再次循环此时(-128 - 1) = +127即 a[128]=127。再循环到a[255]=0;(0对应ASCII码的'\0')。 
//strlen()的机制是计算到第一个'\0'之前的长度,所以输出255。
//会做这个题目,需要对C语言的数据类型有很深的理解

字符型常量:

C语言的字符常量是用单撇号括起来的一个字符。如’a’、’x’、’D‘、’?’、‘$’等都是字符常量。
除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个字符“\”开头的字符序列。

转义字符及其作用:

这里写图片描述

//例:
#include <stdio.h>

int main()
{
    printf("123456780123456\n");
    printf("1234567\b12\n");
    printf("1234567\r00\n");
    printf("1234567\t12\n");
    printf("123456781\t12\n");
    printf("\141\n");
    printf("\x3f\n");
    return 0;
}
//输出: 
123456780123456
12345612             //结论:7输出后输出1,1要退一格把7覆盖
0034567              //结论:光标移到本行开头,输入后面内容,覆盖原先内容
1234567 12           //结论:一个水平制表符占8列
123456781       12
a                    //八进制141即为97对应ASCLL码表a
?                    //十六进制3f即为63对应ASCLL码表?
//例:
int main()
{
    printf("12345678901234567890\n");
    printf(" ab c\t de\rf\tg\n");
    printf("h\ti\b\bj k");
    return 0;
}
//结果:
12345678901234567890
fab c   gde  
h      j k     

字符型变量:

字符变量的定义形式如下:

char c1, c2;
c1=‘a’; c2=‘b’;

在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。

字符数据在内存中的存储形式及其使用方法 :

将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。
例如字符’a’的ASCII代码为十进制数97,’b’的ASCII代码为十进制数98。

在内存中字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据之间可以通用。
一个字符数据既可以以字符形式输出,也可以以整数形式输出。

以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。
以整数形式输出时,直接将ASCII码作为整数输出。
也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。

//向字符变量赋予整数
#include <stdio.h>
void main()
{
    char c1, c2;
    c1=97;
    c2=98;
    printf("%c %c\n", c1, c2);
    printf("%d %d\n", c1, c2); 
}
//输出结果:
a  b
97 98

//大小写字母的转换
#include <stdio.h>
void main()
{
    char c1, c2;
    c1='a';
    c2='b';
    c1=c1-32;
    c2=c2-32;
    printf("%c %c", c1, c2);
}
//小写字母和大写字母之间差:32
//输出结果:A B

#include <stdio.h>
void main()
{

    printf("%c\n", 'A' - 32);
    printf("%c\n", 'A' * 32);
    printf("%d\n", 'A' * 32);
}
//结果://空,没有响应的字符对应
2080

字符数据是有符号整数还是无符号整数?

有没有符号要结合开发平台。

在嵌入式开发中,考虑到代码的移植性,对于有符号(signed)与无符号(unsigned)一定要留心系统默认的是无符号还是有符号;

为了解决此问题,通常使用typedef来重新指定声明无符号还是有符号;
Typedef int sig_int;
Typedef unsigned int un_int;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值