P54 扩展数字的位表示

背景:不同字长的整数进行转换,需要在不改变数的大小的前提下将较小的数据类型转为更大的数据类型。

无符号数的扩展:开头加0即可,也叫零扩展。

有符号数(补码)的扩展:开头添符号位。

 1     short sx = -12345;
 2     unsigned short usx = sx;
 3     int x = sx;
 4     unsigned ux = usx;
 5
 6     printf("sx = %d:\t", sx);
 7     show_bytes((byte_pointer)&sx, sizeof(short));
 8     printf("usx = %u:\t", usx);
 9     show_bytes((byte_pointer)&usx, sizeof(unsigned short));
10     printf("x = %d :\t ", x);
11     show_bytes((byte_pointer)&x, sizeof(int));
12     printf("ux = %u:\t", ux);
13     show_bytes((byte_pointer)&ux, sizeof(unsigned));

注:show_bytes的作用是转换十六进制

运行结果

sx=-12345:  cf c7

usx=53191     cf c7

x=-12345        ff ff cf c7

ux=53191       00 00 cf c7

12345(short)->11 0000 0011 1001(原码)->0011 0000 0011 1001(short,2byte=2*8bit=16位)->1011 0000 0011 1001(最高位添1,-12345的原码)

->1100 1111 1100 0111(-12345的补码)->cf c7(十六进制)

12345(int)->11 0000 0011 1001(原码)->0000 0000 0000 0000 0011 0000 0011 1001(int,4byte=4*8bit=32位)->1000 0000 0000 0000 0011 0000 0011 1001(原码)

->1111 1111 1111 1111 1100 1111 1100 0111(补码)->ff ff cf c7(十六进制)

对比无符号的扩充,cf c7->00 00 cf c7,即零扩展,不难看出,16位扩展至32位的过程中,

补码由1100 1111 1100 0111变成了1111 1111 1111 1111 1100 1111 1100 0111,其变化在于前面补了若干个1,1即-12345的符号位。如果是正数(符号位为0),添0。

因此,实际上扩展数字的位表示可以统一起来

无符号数/正数  0扩展

负数       1扩展

先扩展位,再完成有符号到无符号的转化

如,short->unsigned int

原文地址:https://www.cnblogs.com/CofJus/p/12151954.html

时间: 2024-10-11 18:18:47

P54 扩展数字的位表示的相关文章

关于C++读入数字按位取出与进制转换问题

这一片博客我就不写具体的一个题了,只是总结一种典型问题——读入数字按位取出. 就拿数字12345举例吧. 是首先,我们要取出个位.这样取出: 12345/1=12345 12345%10=5.     //为了好发现规律 这样我们就有了它的个位.十位是这样: 12345/10=1234 1234%10=4. 同理,百位: 12345/100=123 123%10=3. 于是可以发现,取出哪一位,就是要先将原数除以这一位的位名,再模10. 程序: #include<iostream> #incl

C++ 中注意,零扩展和符号位扩展

版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,介绍一下两种扩展的定义 转 http://blog.csdn.net/jaylong35/article/details/6160736 符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0. 比如一个用一个8位二进制表示-1,则是10000001 如果把这个书用16位二进

[LeetCode] Bitwise AND of Numbers Range 数字范围位相与

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive. For example, given the range [5, 7], you should return 4. Credits:Special thanks to @amrsaqr for adding this problem and creatin

Javascript 利用正则表达式实现数字千位分隔符

最近在网上有看到使用js来实现数字的千位分隔符的面试(笔试)题,所以就自己写了一个利用“正则+replace”来实现的方法:    1 var thousandBitSeparator = function(numStr){ 2 var b = /([-+]?\d{3})(?=\d)/g; 3 4 return numStr.replace(b, function($0, $1){ 5 return $1 + ','; 6 }); 7 } 支持正负号匹配,小数点区分,如有错误,希望大大们指出:-

JS实现数字千位符格式化方法

/** * * @param num * @param precision * @param separator * @returns {*} *======================================================= * formatNumber(10000)="10,000" * formatNumber(10000, 2)="10,000.00" * formatNumber(10000.123456, 2)="

生成字母+数字6位字符串

package test; import java.util.Random; import java.util.regex.Pattern; public class CodeUtil { public static final char[] CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N'

JS自动格式化输入的数字/千位分隔符

<script> function cc(s){ if(/[^0-9\.]/.test(s)) return "invalid value"; s=s.replace(/^(\d*)$/,"$1."); s=(s+"00").replace(/(\d*\.\d\d)\d*/,"$1"); s=s.replace(".",","); var re=/(\d)(\d{3},)/;

数据处理4位树代码扩展为6位

原始数据 1    行政后勤            0001 2    院办                  000104810002 4    宣传室                000104810004 5    综合档案室            000104810005 6    收发室                000104810006 7    车队                000104810007 8    人力资源部        00010008 10    医院控

20145326蔡馨熠《信息安全系统设计基础》第三周学习总结

教材学习内容总结 书上有的内容我就不重复赘述了,只需要将部分重要的知识点归纳总结一下. 1.进制 二进制.八进制.十进制.十六进制(转换:以二进制作为中间变量) 2.字 每台计算机都有一个字长,指明整数和指针数据的大小. 虚拟地址是以这样的一个字来编码的,字长决定虚拟地址空间的最大范围. 3.字节顺序 小端法——在存储器中按照从最低有效字节到最高有效字节的顺序存储对象. 大端法——从最高有效字节到最低有效字节的顺序存储. 4.布尔代数 (1)二进制值是计算机编码.存储.操作信息的核心(0.1),