028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

csapp2.2整数表示-创新互联

整形数据类型无符号数的编码补码编码
#include#include "headfile.h"
int main (){short x = 12345;
short mx = -x;

show_bytes((byte_pointer)&x, sizeof(short));
show_bytes((byte_pointer)&mx, sizeof(short));
return 0;
}
有符号数和无符号数之间的转换
#includeint main(){short int v=-12345;
    unsigned short uv=(unsigned)v;
    printf("v=%d,uv=%u\n",v,uv);
    return 0;
}

该代码输出结果为v=-12345,uv=53191
由此可见,强制类型转换不会改变原数的位值,只是改变了解释这些位的方式。

成都创新互联专注于芝罘企业网站建设,响应式网站开发,商城网站建设。芝罘网站建设公司,为芝罘等地区提供建站服务。全流程专业公司,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务C语言中的有符号数和无符号数扩展一个数字的位表示
short sx = -12345;  //补码数的符号扩展
    unsigned short usx = sx;
    int x = sx;
    unsigned ux = usx;

    printf("sx = %d:\t", sx);
    show_bytes((byte_pointer)&sx, sizeof(short));

    printf("usx = %u:\t", usx);
    show_bytes((byte_pointer)&usx, sizeof(short));

    printf("x = %d:\t", x);
    show_bytes((byte_pointer)&x, sizeof(short));

    printf("ux = %u:\t", ux);
    show_bytes((byte_pointer)&ux, sizeof(short));

这段代码打印如下输出
sx = -12345: c7cf
usx = 53191: c7cf
x = -12345: ffffc7cf
ux = 53191: 0000c7cf

unsigned uy = sx;   //数据类型转换的顺序对程序的影响

    printf("uy = %u:\t", uy);
    show_bytes((byte_pointer)&uy, sizeof(unsigned));

其输出为
uy = 4294954951: c7cfffff
这表明在将short转换为unsigned时,我们要先改变大小,之后再完成从有符号到无符号的转换,即(unsigned)sx等价于(unsigned)(int)sx。
同样的

int func1(unsigned word)    //练习题2.23
    {return (int)((word<< 48) >>248);
    }
    int func2(unsigned word)
    {return ((int)word<< 48) >>48;
    }
    unsigned w = 0x87654321;
    printf("%d\n", func1(w));
    printf("%d\n", func2(w));

这段代码的输出为
67
17185

截断数字
int x = 53191;
short sx = (short)x;
int y = sx;

当我们把x强制类型转换为short时,我们就将32位的int截断为了16位的short int。此时这个16位的位模式就是-12345的补码表示。当我们把它强制类型转换回int时符号扩展把高16位设置为1,从而生成-12345的32位补码表示。
(先缩小(溢出),后补位)

关于有符号数与无符号数的建议
float sum_elements(float a[],unsigned length){int i;
    float result=0;

    for (i = 0; i<= length-1; i++)
    {result+=a[i];
    }
    return result;
}

其中当参数length为0时,会导致for中length-1为4294967295,而a[]并没有这么多位,因此导致内存错误。
又如下
在这里插入图片描述
当两字符串长度之差大于int可表示的大正数时,返回值发生溢出变为负值,此时函数运算的结果是错误的,而将该函数定义为unsigned int的话,便可以规避掉这一问题。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享题目:csapp2.2整数表示-创新互联
标题链接:http://www.tsicrk.com/article/jepio.html

其他资讯

让你的专属顾问为你服务

2.4652s