C语言里面,,这段话怎么理解啊?

2025-01-02 16:35:58
推荐回答(5个)
回答1:

首先,从你这句话中可以判定,int类型是2字节的,long类型是4字节的。也就是说int类型是八位,long类型是16位,系统是16位系统
(这里不明白可以参考http://blog.sina.com.cn/s/blog_6f62c9510101svjz.html)。
然后说符号扩展的问题。
在这里,是小的数向大的数扩展,long类型: 0000 0000 0000 0000
int类型: 0000 0000

显int类型是偏小的数,在数的强制转换的时候,会将int的这八位放在long类型的后八位上。比如说 int类型是 0000 
1001(也就是9),转换成long类型是0000 0000 0000 
1001(算下来也是9),两者都是整数类型,不过是位数不一样。正数的转换不会变它的值,但是占用的字节数不一样而已。
负数: 首先,我们做一个十进制负数转换成二进制的。
计算机中一般用补码来表示,若对于补码有不清楚之处请参考http://baike.baidu.com/view/377340.htm
负数转换为二进制,就是将其相反数(正数)的补码的每一位变反(1变0,0变1)最后将变完了的数值加1,就完成了负数的补码运算。这样就变成了二进制。
 
举个例子:
将-1变成二进制。
①首先确定二进制的位数,假定为16位,即可以表示-32768到32767的所有十进制整数。
②将-1的相反数,也就是1表示为二进制0000 0000 0000 0001(十六进制表示为0x0001)
(由于四位二进制可以表示为一位十六进制,故一般将二进制按四位进行分段表示)
③将这个二进制变反,可以得到1111 1111 1111 1110(十六进制HEX表示为0xFFFE)
④将变反后的数值加上1,得到-1的二进制表示1111 1111 1111 1111(十六进制表示0xFFFF)
 
其他在16位二进制可以表示范围内的负数均可如此进行计算。
这里需要注意的是:
①二进制的位数及其可以表示的十进制数的范围。
②二进制数码变反加一的过程。

所以高位不再补0,而是补1!
不懂继续追问!

所以高位不再补0,而是补1!

不懂继续追问!

回答2:

int型,在内存中要占16位(2个字节),其中最高位是符号位,0代表正值,1代表负值;long型,在内存中要占32位(4个字节)。int型转换为long型—即短数据类型转换为长数据类型(有符号的),C给出的解决办法是符号位扩展机制,并且要保证扩展后的数值大小不变。
例如:10
int型:0000 0000 0000 1001 扩展成long型后是:0000 0000 0000 0000 (高16位全为0,因为符号位是0) 0000 0000 0000 1001
例如:-10
int型:1000 0000 0000 1001 扩展成long型后是:1111 1111 1111 1111 (高16位全为1,因为符号位是1) 0000 0000 0000 1001

但如果是无符号数的短数据类型转换为长数据类型,则是进行零扩展,即用零来填充长数据类型的高字节位。

回答3:

理解意思就是
int 型占16位,long占32位情况下
当把一个int型数据赋给一个long型变量时,就要进行符号扩展,它会把int型数据的16位原封不动送到long型变量的低16位中,然后再按int型数据的正负,扩展符号位,如为正,则long型变量的高16位全部填充为0,为负则全填充为1
把一个long型数据赋给一个int型变量时,系统会将long型数据的低16位原封不动送到整型变量,也就是截取long型的低16位;

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

回答4:

1、上面话的意思已经表达的很清楚,不理解估计是int型、long型的基本定义理解不够透彻,建议拿出教科书,再研读一下c中基本类型的定义,这才是从根本上解决问题;

2、 一般,c语言中:int型占2个字节,long型占4个字节;一个字节占8位;这样int型就是占16个字节,long型占32个字节;正数符合用0标识,负数用1标识;将int值赋值给long,相当于将小盒子放到大盒子中,等等....看书吧;

回答5:

首先你要知道int数据类型的表示方式,00000000 00000000 16bit, 最高位是符号位 也就是题中描述的高16位,为0时表示正,为1时表示负。然后long数据类型是4byte,也就是32bit,然后也是最高位表示符号位。 假设一个变量 int num_x
如果 int num_x 是正数(高16位为0),赋值给long数据类型时 可以直接复制bit0 ~ bit15。例如 int num_x = 10 转换后 long new_num = 10. 表示为 0 0000000 00001010
如果 int num_x 是负数 (高16位为1),赋值给long数据类型时,符号也要复制过来
如 int num_x = -10,那么转换后的long new_num 表示为 1 0000000 00000000 00000000 00001010