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

如果一个char 负数如-1在计算机中代码为1111 1111,那么把他赋值给int 型的数,int 是不是就变成了0000 0000 1111 1111 ,这就变成255了,对不对?如果不对,那负数不同类型之间是如何转换的?
2026年09月20日 02:24
有3个网友回答
网友(1):

错的,这个程序我亲自敲了代码,结果打印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,我敲代码亲自验证了的。

网友(2):

在正数前加1,为有符号型

网友(3):

还是-1啊,怎么能这样转换呢,基本的运算都不能保证还能叫C语言吗?