关于C语言中 char 型负数赋值给int

如果一个char 负数如-1在计算机中代码为1111 1111,那么把他赋值给int 型的数,int 是不是就变成了0000 0000 1111 1111 ,这就变成255了,对不对?如果不对,那负数不同类型之间是如何转换的?

错的,这个程序我亲自敲了代码,结果打印int型的数,结果也为-1,我想,原因可能如下:
都知道负数在计算机内部的存储形式为:取其绝对值的“反码”再加1,即:源码的反码加1
一、-1的源码:1
二、反码的情况(用二进制表示)
(1)若为1字节则为:1111 1110
(2)若为4字节的int型,则为:1111 1111 1111 1111 1111 1111 1111 1110
三、反码加1,即为:
(1)若为1字节则为:1111 1111
(2)若为4字节的int型,则为:1111 1111 1111 1111 1111 1111 1111 1111
所以,还是为-1

所以我的分析为:计算机存储负数都采用上面的规则,不管其占用几个字节。

还有关于 “蓝人poke”兄台所说的东西,我觉得需要更正一下:
这并不是“基本的运算都不能保证”,一个系统有自己的一套的法则。
我可以有办法让他显示为正数,代码如下:
char c=-1;
int b;
memset(&b,'\0',4);//将b的4字节存储单元清零,因为b没有初始化,其内存的值是随机的。
memcpy(&b,&c,1);//将c的内存的内容拷贝到b的内存当中去。
printf("%d\n",b);
这个时候肯定为正的了,这里将c的内存的值直接拷贝到b的内存当中。
要明白,计算机存储数据,并不是如上所示的简单的内存拷贝,他有自己的规则的

果然,输入上面的代码,得到的结果是:255,我敲代码亲自验证了的。追问

我看了上面的说法,感觉结果对的但原因可能不太多,昨天我问我一同学,他告诉我汇编处理这种数的时候会跟据最高位判断,比如,unsigned char 1111 1111 ,这是255,但是赋值给int的时候,因为int是有符号数,所以计算机会验证unsigned char的最高位,会赋值为1111 1111 1111 1111,但是如果是char 1111 1111 ,赋值给unsigned int,因为unsigned int为无符号,所以不验证符号位,得结果为255,说是强制转换引起的错误,不知对否

追答

int main()
{
unsigned char a = -1;
printf("%d\n", a);
}
上面的运行结果为:255,你自己可以试
所有说前面的声明“unsigned char a”无效,系统只会看“=”后的是不是实际的负数,如果是,则按照负数的存储规则(即:补码)来进行存储。又如:
int main()
{
unsigned char a = -1;
unsigned int b=(int)a;
printf("%d\n", b);
}
运行结果也是255,因为第二个等号后的“a”,在前面声明为(unsigned char),则按照正数的规则去存储,不把a的最高位当作符号位,而当作数据位。又如下面的:
int main()
{
unsigned char a =(unsigned char) -1;
unsigned int b=(char)a;
printf("%d\n", b);
}
运行结果为:-1

因此你同学说的,可以说对,但不确切。汇编我了解的不深,但是从上面的三个例子,可以看出,系统先判断等号右边的数,当为“-”开头,或者声明为:有符号时,按补码规则存储。
一切“听说”,我想都不可靠,还是自己敲代码验证吧!
还有,各个系统的编译规则也不尽相同,如:
struct a{ //空的结构体
}
sizeof(struct a)=?
在linux中得到的结果为:0,但是在VC中得到的结果为:1
所以还是那句话:还是自己敲代码验证吧!

追问

呵呵,真是麻烦你了,我电脑上没有VC,不好用这个验证,我搞控制算法,想用负数的,又担心算负数会出错,我上次因为追问限字数,没有说!

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-14
在正数前加1,为有符号型
第2个回答  2012-03-14
还是-1啊,怎么能这样转换呢,基本的运算都不能保证还能叫C语言吗?

关于C语言中 char 型负数赋值给int
错的,这个程序我亲自敲了代码,结果打印int型的数,结果也为-1,我想,原因可能如下:都知道负数在计算机内部的存储形式为:取其绝对值的“反码”再加1,即:源码的反码加1 一、-1的源码:1 二、反码的情况(用二进制表示)(1)若为1字节则为:1111 1110 (2)若为4字节的int型,则为:1111...

c语言怎样把char的值赋给int
其他数字以此类推 也就是说我们看到的字符'1',在内存中实际上是0x31, 跟实际值差了 0x30 也就是十进制 48 所以b = a[0] - '0'; 或者 b = a[0] - 0x30;最后说一下你char a[] = “1”;这个定义的事实上是一个字串,不是字符。a这个变量所在的地址内存应该是 0x31, 0x00 声...

C语言中把unsigned char 型数据赋值给int 型数据会不会出问题
这个问题,因为不知道你具体的使用环境,没法作出进一步的判断,只能将 unsigned char型的变量赋给一个int型的变量会发生什么事情告诉你。unsigned char a = 'A';int b = -1666666;b = a;由于unsigned char类型的变量只有一个字节,而int类型有4个字节,当将一个unsigned char类型的变量赋给一个int...

C语言为什么char型数字求余得到的是int型数字
一般情况下,取余数函数默认输出是整数型,所以你会看到是数字,你可以把它强制作为字符型输出的话就能理解了。include int main(){ char c1 = '~';\/\/126 int i1 = c1%68;\/\/对68取余数,应该的结果是58 printf("char [%c] , int [%d].\\n",i1,i1);return 0;} \/\/输出结果如下 ch...

C语言为什么char型数字求余得到的是int型数字
所以你会看到是数字,你可以把它强制作为字符型输出的话就能理解了。include <stdio.h>int main(){char c1 = '~';\/\/126int i1 = c1%68;\/\/对68取余数,应该的结果是58printf("char [%c] , int [%d].\\n",i1,i1);return 0;}\/\/输出结果如下char [:] , int [58]....

c语言中int型和char型变量相互赋值有何区别
c - '2' == c - 50,与c - 2差别是明显的。对于c - '2'来说,这里的c通常是char类型,其值可能是'2','3',...‘8’,‘9’,那么c - '2'就是一个差值,这个值代表c与'2'的距离。对于c - 2来说,这里的c可能是一个int类型,实际效果就是求两个整数的差。

怎么把char转成int
char转成int的方法:C语言中char类型本身就是整型类数据变量,可以直接赋值给int变量。char占一个字节内存空间,可表示的有符号数为-128~127,无符号数0~255。C语言中字符是按其ascii值进行存储的,如,字母‘a’,其实际存储在内存中的数据为97,只是在输出时,因格式串的不同,表现出来的形式不同...

c语言程序如何将char里的数字赋值到int里?
char s[]={"16255 1564 5694\\0"};int a,b,c;sscanf(s,"%d %d %d",&a,&b,&c);printf("\\n%d %d %d",a,b,c);

C语言中,-130如果是char类型的 在计算机里面是如何让存储的??如果用%d...
char类型占一个字节,表示的有符号数范围:-128~127 -130超出该范围,会溢出 因为计算机中存储的整数为其补码形式,整数-130的补码为:1111 1111 0111 1110(假设以两字节表示)赋值给一个字节时,得到的结果是0111 1110 按整数输出就是126

c语言中,char怎么赋值
1、char类型,也就是常说字符类型。char类型和其它类型一样在定义和初始化上可以先声明(定义),再赋值(初始化)。使用char来定义一个字符,通过单引号括起来的单个字符赋值给它。2、当然你也可以在定义变量的时候就初始化(也就是在声明的时候赋值)。3、注意字符并不意味着字母,单引号括起来的...

相似回答