如果一个char 负数如-1在计算机中代码为1111 1111,那么把他赋值给int 型的数,int 是不是就变成了0000 0000 1111 1111 ,这就变成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,不好用这个验证,我搞控制算法,想用负数的,又担心算负数会出错,我上次因为追问限字数,没有说!