刚学C语言 请问ASCII码值为128-255字符型数据转为整型变量时得到的是-128--1的值 怎样算的 谢谢
2个回答
展开全部
因为一个char的大小是一个byte即8个bit,一共可以表示2的8次方即256个数字0-255
但是char分为signed和unsigned两种形式,即是否有正负之分
如果是signed就是有正负号的,在机器码中8位二进制bit就需要占用一个作为区别正负号的标记,分别用1或0表示,那么剩下的7个bit能够表示0-127的数字,由于2的8次方一共是256个数字,可以得到负数范围内有128个数字,即一个signed char能表示从-128-127的数字
与之相对的,unsigned char即表示从0-255的值,由于ASCII码没有负值,而且一般的ASCII码只需要使用0-127就足够了,所以剩下的那128个字符就组成了extended ASCII,当然,一般是没有什么作用的,也可以看到这个范围的符号一般都是些稀奇古怪的,但是你将它赋值到这个范围就引起了这个问题
虽然定义一个char变量生成的究竟是unsigned char还是signed char和你具体使用的环境有关,但一般的INTEL计算机都是生成signed char,如果你不能确定可以使用limits.h中提供的常量来确定,当然int long 等等也能够用相同方式查看,如果是float的话用float.h查看,具体的可以查询library的说明,程序如下,自己运行看看吧
#include <stdio.h>
#include <limits.h>
main(){
int a=CHAR_MIN;
int b=CHAR_MAX;
printf("%d %d\n",a,b); //Print the minimum value and maximum value of data type char
}
现在我们已经明白了,用8位bit表示的signed char是无法表示超过127的数字的,所以呢,当你赋予变量一个超过127的值的时候,它就会自动变回负值的最小值并向上递加,可以想象成一个圆环,原理在于CPU中只存在加法器,所以如果不能循环,你就没法做减法了,具体的你可以随便买一本微机原理看看,我推荐CSAPP,如果你想要具体研究C语言的话,可以看看C语言圣经K&R,多用用LINUX
但是char分为signed和unsigned两种形式,即是否有正负之分
如果是signed就是有正负号的,在机器码中8位二进制bit就需要占用一个作为区别正负号的标记,分别用1或0表示,那么剩下的7个bit能够表示0-127的数字,由于2的8次方一共是256个数字,可以得到负数范围内有128个数字,即一个signed char能表示从-128-127的数字
与之相对的,unsigned char即表示从0-255的值,由于ASCII码没有负值,而且一般的ASCII码只需要使用0-127就足够了,所以剩下的那128个字符就组成了extended ASCII,当然,一般是没有什么作用的,也可以看到这个范围的符号一般都是些稀奇古怪的,但是你将它赋值到这个范围就引起了这个问题
虽然定义一个char变量生成的究竟是unsigned char还是signed char和你具体使用的环境有关,但一般的INTEL计算机都是生成signed char,如果你不能确定可以使用limits.h中提供的常量来确定,当然int long 等等也能够用相同方式查看,如果是float的话用float.h查看,具体的可以查询library的说明,程序如下,自己运行看看吧
#include <stdio.h>
#include <limits.h>
main(){
int a=CHAR_MIN;
int b=CHAR_MAX;
printf("%d %d\n",a,b); //Print the minimum value and maximum value of data type char
}
现在我们已经明白了,用8位bit表示的signed char是无法表示超过127的数字的,所以呢,当你赋予变量一个超过127的值的时候,它就会自动变回负值的最小值并向上递加,可以想象成一个圆环,原理在于CPU中只存在加法器,所以如果不能循环,你就没法做减法了,具体的你可以随便买一本微机原理看看,我推荐CSAPP,如果你想要具体研究C语言的话,可以看看C语言圣经K&R,多用用LINUX
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询