C语言中输入超出char取值范围用十进制输出的结果

C语言中 字符常量我们通常这么定义:

char c1 = 'a';        //字符常量‘a’
char c2 = '\x61';     //'\x..' 十六进制字符常量     61H变为01100001B变为97D
char c3 = '\141';     //'\...'八进制字符常量        141O变为001100001最高位的0舍去变为                      
                      //01100001B=97D
char c4 = 97;         //十进制数转换成字符常量
char c5 = 0x61;       //十六进制数转换成字符常量  0x..     等价于上面的c2
char c6 = 0141;       //八进制数转换为字符常量    0...
printf("c1=%c,c2=%c,c3=%c.c4=%c,c5=%c,c6=%c\n", c1, c2, c3, c4, c5, c6); //输出结果都为a因为字符型常量以ASCII码,2进制形式存放 上面的都表示2进制的01100001 对应ASCII码表的a; 并且为字符形式输出
printf("c1=%d,c2=%d,c3=%d.c4=%d,c5=%d,c6=%d\n",c1,c2,c3, c4, c5, c6);//以数值形式输出 都为0110001B=97D 结果都为为97
   

所以在输出字符常量的值的时候我们可以用%c输出对应ASCII码表中的字符如:A ,B,C,a,b,c等等

我们也可以用十进制%d输出结果 对应输出的是ASCII码值

char的取值范围为-128~127

在这里如果我们用十进制数转换成字符常量 并且超出ASCII码表中的值0~127那么会输出什么

如这里我们char c3 =130;  printf("%d\n",c3);会输出什么呢?

int main()
{
    char c1, c2, c3;
    c1 = 'a';
    c2 = 'b';
    c1 = c1 - 32;        //ASCII码中 a与A相差32      a为97  A为65
    c2 = c2 - 32;
    c3 = 130;    
    printf("%c %c %c\n", c1, c2, c3);
    printf("%d %d %d\n", c1, c2, c3);   //这里c3会输出什么呢?
    return 0;
}*/


在这里我们首先要知道整型数据在计算机内部用四个字节表示,取低8位赋值给字符变量

那么接下来就很好操作了

130是int类型是占4个字节的,所以在内存的表现形式是
00000000  00000000  00000000  10000010

做了截取后的结果为
10000010
 通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码
原码:1 0000010    原码变反码,最高位符号位不变,其他数值位1变0, 0变1得反码
反码:1 1111101    反码变补码就是反码加1得
补码;1 1111110
最终的看到的结果就是
1     1111110最高位是符号位不运算,数值为转化为十进制是64 + 32 + 16 + 8 + 4 + 2 = 126符号位负
所以为 - 126


ASCII码中128以下都有对应0~127 按照上面举例127
00000000 00000000 00000000 01111111
截取01111111
开头为0 看作一个正数,所以补码相同 还是127
查ASCII码中为多少
    
 都是用4个字节表示所以能取很大的数,但是只取最后8bite。如256最后输出结果为0。
所以以上就是C语言中输入超出ASCII码表中的字符常量用十进制输出的结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值