回 帖 发 新 帖 刷新版面

主题:求助啊,赋值运算中的类型转换问题!

程序如下

#include<stdio.h>

void main()

{

    unsigned i;
    int j=-1;
    i=j;
    printf("%u",i);

}

运行后输出的是十进制数65535

若j为正值,且在0~32767之间,则赋值后数值不变,运行结果就是j本身的值。

我晕,我实在是看不懂了,这是我的教材上的原文。。。

是《整型数间的转换》的例题

各位帮帮吧,谢谢咯!

回复列表 (共5个回复)

沙发

找找關鍵字:
補碼

板凳

j=-1  j是整型的,在内存中占2个字节及16位。在计算机中以二进制的补码存放。一个正整数的补码和该数的的原码(及该数的二进制形式)相同。求负数的补码的方法是:将该数的绝对值的二进制形式,按值取反再加1。例如j=-1,取绝对值1,1的绝对值二进制形式为0000000000000001,取反1111111111111110,再加1则为1111111111111111(及j=-1在内存中实际存储的情况)。而定义的i是无符号的整型变量,j赋给i,i就是1111111111111111,转化为十进制即为65535。
“若j为正值,且在0~32767之间,则赋值后数值不变,运行结果就是j本身的值。”j默认是signed,16位补码中第一位为符号位,1表负号,0表正号。所以取值范围为-32768~32767之间(即后15位二进制数转化为十进制的范围)。

3 楼


谢谢谢谢谢谢~~~呵呵,明白了

在学校,不是天天都上得了网,回复慢了些~抱歉啊~

4 楼

[quote]j=-1  j是整型的,在内存中占2个字节及16位。在计算机中以二进制的补码存放。一个正整数的补码和该数的的原码(及该数的二进制形式)相同。求负数的补码的方法是:将该数的绝对值的二进制形式,按值取反再加1。例如j=-1,取绝对值1,1的绝对值二进制形式为0000000000000001,取反1111111111111110,再加1则为1111111111111111(及j=-1在内存中实际存储的情况)。而定义的i是无符号的整型变量,j赋给i,i就是1111111111111111,转化为十进制即为65535。
“若j为正值,且在0~32767之间,则赋值后数值不变,运行结果就是j本身的值。”j默认是signed,16位补码中第一位为符号位,1表负号,0表正号。所以取值范围为-32768~32767之间(即后15位二进制数转化为十进制的范围)。[/quote]


好标准!

5 楼


这样的分析我也懂,但实在是不能写的像该楼这样清楚和细致,顶。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册