c语言输出字母是问号,关于C语言输出ASCII码128~255和有符号char型溢出的问题。此处大坑弄明白了后记录下来分享……...

以下代码在控制台正常输出会出现乱码

#include

int main(){

char a=197;

printf("%c",a);

return 0;

}

为什么呢?

前提条件说明,C语言中char类型默认是有符号类型(范围是-128~127之间)

首先这个197对应的字符是在ASCII表中存在的,就像0~255的ASCII表中显示的一样,之所以会输出问号或则其他不知名符号(乱码),是因为我们的电脑里面CMD默认的代码页是936(ANSI/OEM - 简体中文GBK),用于在控制台中显示中文的。所以才会有问号乱码的现象。如果需要显示出来128~255的字符(255是一个blank'FF'标准空值,不显示),就需要将控制台的代码页改成美国的标准:437(OEM-美国),就可以正常显示显示SCII码中128-255的特殊字符。

最简单的方法就是在程序中加上以下的头文件和命令就可以修改代码页的默认显示方式:

#include

#include

int main(){

SetConsoleOutputCP(437);

char a=197,b=198;

printf("%c %c",a,b);

}

通过以上修改,就可以正常显示ASCII表中对应的197和198字符,分别是 ┼ 和 ╞

其他字符也可正常显示。

除此之外,C语言中,当char是有符号类型的时,即表示范围为-128~127。在有符号char类型当中0 ~ 127和-128~-1这两段在存储上分为两个不同的段。

-128~-1存储为4个字节,前三个字节都为符号位,

比如-128就等表示为 11111111 11111111 11111111 10000000

-1则表示为    11111111 11111111 11111111 11111111

而我们想像中的-1应该表示为:(需要注意的是后七位并不是表示0,而是表示-1,0是由一个字节表示的且符号位为0)

11111111 11111111 11111111 1000000

我们想象中的-128应该表示为:(后七位并不是表示-127,理由同上。还需注意的是前三个字节是符号位,全为1表示负数)

11111111 11111111 11111111 11111111

而正数0~127段存储为一个字节,无符号位

比如1就表示为 00000001

127表示为 01111111

综上所述,数据在计算机中的存储形式是以补码的形式存储的,并且在C语言中有符号的char型,其负数段与正数段在内存的存储形式不一样,但其任然满足溢出就从最低范围循环计数的原理。

如有不足,欢迎指出。

标签:11111111,符号,C语言,char,127,128,255

来源: https://blog.csdn.net/qq_40596572/article/details/88668217

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ```c #include <stdio.h> int main() { char c; scanf("%c", &c); // 输入一个字符 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { printf("%d\n", c); // 输出ASCII码的值 } return 0; } ``` ### 回答2: 要用C语言判断一组字符是否是字母,并输出ASCII码的值,可以使用C语言中的if语句和ASCII码的对应关系来实现。 首先,我们需要定义一个字符数组,并将待判断的字符存储在数组中。接下来,我们可以使用if语句对字符进行判断。判断的条件可以是字符是否在ASCII码表中字母的范围内。 下面是一个示例代码,实现了对一组字符的判断和输出: ```c #include <stdio.h> int main() { char characters[] = "abc123"; int i; for(i = 0; characters[i] != '\0'; i++) { if((characters[i] >= 'a' && characters[i] <= 'z') || (characters[i] >= 'A' && characters[i] <= 'Z')) { printf("字母:%c,ASCII码:%d\n", characters[i], characters[i]); } } return 0; } ``` 在代码中,我们使用了for循环遍历字符数组,判断每个字符是否是字母。if语句里的条件表达式判断了字符是否在小写字母和大写字母的范围内,如果满足条件,则输出字符和其对应的ASCII码。 上述代码的输出结果为: ``` 字母:a,ASCII码:97 字母:b,ASCII码:98 字母:c,ASCII码:99 ``` 这样,就可以实现用C语言判断一组字符是否是字母,并输出ASCII码的值。 ### 回答3: 可以通过C语言中的字符判断函数isalpha()来判断一个字符是否是字母。如果判断结果为真,即表示这个字符字母,可以使用函数printf()输出ASCII码的值。 下面是用C语言编写的示例代码: ```c #include <stdio.h> #include <ctype.h> //引入isalpha函数所在的头文件 int main() { char ch; //定义一个字符变量ch printf("请输入一个字符: "); scanf("%c", &ch); //从用户输入中读取一个字符并存入ch if (isalpha(ch)) { //判断字符ch是否是字母 printf("%c的ASCII码是:%d\n", ch, (int)ch); //输出ch的ASCII码的值 } else { printf("%c不是字母\n", ch); //如果不是字母,则输出提示信息 } return 0; } ``` 以上代码中,我们首先定义了一个字符变量`ch`,然后通过`scanf()`函数从用户输入中读取一个字符并存入变量`ch`中。然后使用`isalpha()`函数判断`ch`是否是字母,如果是字母,则输出字符ASCII码值;如果不是字母,则输出提示信息。最后返回0,表示程序正常结束。 当执行程序并输入一个字符时,如果该字符字母,程序将输出字符ASCII码的值;如果不是字母,则输出相应的提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值