C语言的赋值问题!!

来源:百度知道 编辑:UC知道 时间:2024/09/23 14:32:20
长整数型向有符号整数型赋值,说明不如上语句,语句如下:

#include "stdio.h"

main()
{
int x;
long y=65535;
x=y;
printf("%d",x);
getch();
}

执行后X值为-1

#include "stdio.h"

main()
{
int x;
long y=32768;
x=y;
printf("%d",x);
getch();
}

执行后X值为-32768

这两题在思考后,都已经想出了为什么会是这个值,只是很搞不懂,这样的长整数型向有符号整数型赋值的时候,符号位到底是按什么规则赋上去的??(正数为0,负数为1,在长整数型存储内存位置的第一个位置表示)
覆盖?还是相加?或者相减???或者????????

望高手指教
很感谢各位对我问题的解答,但是其实为什么运算结果会是这样,我在上面也已经讲过了我自己已经想透了,
我想知道的是,如果把低16位截取覆盖过去之后,符号位如果还为1(也就是负数),这个符号位是要传递到被传递函数的最高的那一位的,那是以一个什么方式进行传递的呢??
覆盖?还是相加?或者相减???或者????????

顺便说一句我的开发环境是TC3.0

首先你可以用如下这个程序查看你的编译系统规定各种类型到底占多少字节,因为这个会因编译系统的不同会有不同
#include<stdio.h>
void main()
{
long i;
int j;
short k;
printf("long=%d,int=%d,short=%d",sizeof(i),sizeof(j),sizeof(k));
}
再说下不同类型数据间转换的问题,我以int型16位,long型32位为例
int 型占16位,long占32位情况下
当把一个int型数据赋给一个long型变量时,就要进行符号扩展,它会把int型数据的16位原封不动送到long型变量的低16位中,然后再按int型数据的正负,扩展符号位,如为正,则long型变量的高16位全部填充为0,为负则全填充为1
把一个long型数据赋给一个int型变量时,系统会将long型数据的低16位原封不动送到整型变量,也就是截取long型的低16位;

总结为一句就是,不同类型之间转换的时候,都是按照数据在内存中的存放形式传递的,占用短的向占用长的传递时就需要进行符号扩展。

从你给的第一个程序可以看出你的编译系统规定的是int型16位,而从你第二个程序可以看出long型是32位了

65535 (long型)-> 0000 ffff
传递给int型,截取其低16位也就是ffff,这个就是补码形式的-1了
32768 (long型)->0000 8000
传递给int型,截取其低16位也就是8000,变成2进制就是1000 0000 0000 0000,可见是补码形式的-32768

赋值传递永远是覆盖操作

/*
前提:你运行环境下int型是2个字节。

long y=65535,在内存中就是00 00 FF FF
传递给int时,因为int只有两个字节,所以直接把低位传递给int,
于是x=FFFF;二进制形式