>> 关于计算机有符号数的符号拓展(sign extension)问题

这里首先阐述相关规律, 情况为将位数较少的有符号存储空间中取出数据并放入更大有符号存储空间, 如: char → short .

规律: 将原空间符号位重复填充至新空间剩余位. 

eg.(负数情况, 正数同理)

char:   1000 0000        →

short:  1111 1111 1000 0000

-------------------------------------------------------------------------------------------------

证明:

A = (1000 0000)2 = (-27 )10= (-128)10

B = (1111 1111 1000 0000)2 = (-215+214+213+......+28+27)10

=( 214(1-2) + 213 +......+27)10

=(-214+213+......+27)10

=(-27)10 = (-128)10   =   A

得证该例.

---------------------------------------------------------------------------------------------

证明(一般性):

设A = (1X)2 = (-2n-1 )10 + (X)2

B = (11......1 1X)2 = (-2m-1+2m-2+......+2n+2n-1)10+(X)2

=(-2n-1)10 + (X)2  =  A

得证.

时间: 2024-08-07 21:18:32

>> 关于计算机有符号数的符号拓展(sign extension)问题的相关文章

有符号数与无符号数比较的坑

前言 在c/c++ 的项目编译时经常会遇到 “comp.c:59:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]” 这种错误.作为一个”合格的程序员“ 对这种编译告警,通常的处理是忽略,毕竟大家一致的观点是:只有“warning”不算问题! 下面给出一个小case: #include <stdio.h> int sum_elements(int a[], unsig

有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的

一.有符号数的加减法 1.符号数与无符号数的人为规定性: 一个数,是有符号数还是无符号数都是人为规定的.进行二进制运算时用无符号数或是补码运算时,结果都是正确的. 10000100+00001110 若规定为无符号数,即 132+146=146D . 若规定为符号数,则为-124+14=-110,而[-110]补=10010010.解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码.机器中的有符号数的运算一般就是补码的运算. 2.补

有符号数和无符号数负数(转)

有符号数和无符号数负数 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高

有符号数和无符号数

摘抄自:http://www.cnblogs.com/glacierh/archive/2013/07/16/3194658.html 1.      补码 在计算机中无符号数用原码表示,有符号数用补码表示.w位补码表示的值为: 最高位 也称符号位,1表示负数,0表示正数,符号位为0时,和无符号数的表示是相同的,以下是4位补码的示例: 0101 = -0*23 + 1*22 + 0*21 + 1*20 = 5 1101 = -1*23 + 1*22 + 0*21 + 1*20 = -3 w位的补

C语言之有符号数和无符号数

我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时候需要使用有符号数来表示一个整数,因此我们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数. 1:有符号数和无符号数在数值上的区别. 有符号数的最高位用来表示符号,所以在最大的数值上,有符号数的最大值小于无符号数.以一个字节为例: 有符号数的取值范围为:-128 - 0 - 127 无符

关于操作有符号数的溢出问题

在计算机中,数值的二进制表示方法主要有:原码.反码和补码.通常取最高位为符号位,0表示正数,1表示负数.正数的原码.反码.补码一样.而负数的原码最高位取1,数值位取负数绝对值的二进制值:反码的符号位为1,其余位取反:补码的符号位为1,其余位取反加1. 在32位计算机中,有符号字符型变量的取值范围是-27 ~ 27-1,有符号整型变量的取值范围是-215~ 215-1,如果将有符号整型变量赋给有符号字符型变量,则高位被截断,保留低八位. 看一个例子: #include<stdio.h> #inc

理解有符号数和无符号数

负数在计算机中如何表示呢? 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数.这种说法本身没错,可是如果没有下文,那么它

C语言基础(5)-有符号数、无符号数、printf、大小端对齐

1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码 无符号数最小为0,不可能是负数 定义一个无符号的int unsigned int a; //使用unsigned int 定义了一个无符号的int变量,名字叫a short,long,long long,

关于有符号数和无符号数的转换 - C/C++

转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题,被它们之间的转换原理和位移原理搞得头大了.真的很后悔本科的时候没有认真学习<计算机组成原理>/<计算机操作系统>等计算机基础课程.以下是我根据相关知识回顾和整理的材料,如有和某某的文章有雷同之处,请勿见怪.另外也希望看到这篇文章的同志们能够有所收获吧. #include <cst