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码表中的字符常量用十进制输出的结果