负数在内存中的存储形式——补码

1、数在内存中都已补码形式存在

https://blog.csdn.net/u012511672/article/details/51724272

对于一个负数-x,它的二进制表示(补码)求法如下:

  1. 求出-x的相反数x的原码
  2. 对x的原码进行取反运算
  3. 将取反运算的结果+1

”绕回处理“

对于大多数语言来说,char类型的有效范围是-128~127,那么如果我们把128这个超过了char类型表示范围的数赋值给一个char型变量ch,结果会怎样呢?ch的值会变成0,还是其它值?答案是,ch的值会变成-128,因为128超越了最大值127,于是它开始从最小值开始,搜索一个合适的位置。同样的道理,将129赋值给ch,ch的值会变成-127。道理就是这样,以此类推。

还有一个原理就是有符号和无符号数据的区别。我们知道,char也分为signed和unsigned两种,前者是默认值,而后者的表示范围是0~255。不管有无符号,这个区间的大小都是256,这也在情理之中,毕竟1个字节由8个位组成,每个位可以取0或1,那么一共就能表示2^8种不同的情况,2^8就是256。
同时,根据上面的理论,我们可以得出,将255赋值给ch,结果是-1。我们可以分别求出255和-1的补码,它们都是11111111。当然,这不是什么巧合,这是有科学道理的。255是unsigned char的最大值,它也是signed char能表示的负数中的最大值。当一个char是unsigned类型的时候,它的第一位自然不会被认为是符号位,所以11111111能表示255,而当这个char是signed类型时,第一位被解析成符号位,结果就是-1了。

2、对绕回和同余的解释

https://www.cnblogs.com/zengguowang/p/6074845.html

-336的无符号整数是65200呢?书上说是2的补码(书中描述):数字0到32767代表它们本身,而数字32768到65535则代表负数,65535代表-1,65534代表-2,依次类推,因此-336由65536-336,也即65200来表示;

3、参考知乎答案:同余


作者:知乎用户
链接:https://www.zhihu.com/question/28685048/answer/41735701
来源:知乎

很多人并不理解补码。补码就是同余啊。1000000是正128你知道吧,正负128模256是同余的。加减乘可以直接算也是同余的定理决定的,而不是凑出来的巧合,哪可能凑出这种东西?

8位只能表示256个数,0到255,但我还想表示一些负数怎么办呢?就用与该负数同余的正数来表示呗。-1=255,-2=254,等等。

建议脱离算数的思维方式,这其实就是一个环。模任何一个正整数(如256),可以把所有整数分类,比如模256可分256类,0 256 -256...是一类(余0类),1 257 -255...是一类(余1类),等等,这256类可看作环Z_{256}的元素,你看-128和128是同一个类里的(余128类),用一个代表另一个罢了。补码和普通的unsigned integers都是在每类中选一个数,unsigned integers选0到255,补码表示的有符号整数选-128到127,都是一个数恰好对应一个类。

当你明白这一切后,补码就是顺理成章的事。

练习:设计用8位二进制数表示13至268这256个数的方案。要求作加减乘运算的时候,可以直接把编码当正整数算,能得到正确结果。

4、8位有符号数的列表   内存中8位二进制10000000表示 -128
作者:赵德顺
链接:https://www.zhihu.com/question/28685048/answer/340447990
来源:知乎

-1<--->11111111

-2<--->11111110

-3<--->11111101

-4<--->11111100

-5<--->11111011

-6<--->11111010

-7<--->11111001

-8<--->11111000

-9<--->11110111

-10<--->11110110

-11<--->11110101

-12<--->11110100

-13<--->11110011

-14<--->11110010

-15<--->11110001

-16<--->11110000

-17<--->11101111

-18<--->11101110

-19<--->11101101

-20<--->11101100

-21<--->11101011

-22<--->11101010

-23<--->11101001

-24<--->11101000

-25<--->11100111

-26<--->11100110

-27<--->11100101

-28<--->11100100

-29<--->11100011

-30<--->11100010

-31<--->11100001

-32<--->11100000

-33<--->11011111

-34<--->11011110

-35<--->11011101

-36<--->11011100

-37<--->11011011

-38<--->11011010

-39<--->11011001

-40<--->11011000

-41<--->11010111

-42<--->11010110

-43<--->11010101

-44<--->11010100

-45<--->11010011

-46<--->11010010

-47<--->11010001

-48<--->11010000

-49<--->11001111

-50<--->11001110

-51<--->11001101

-52<--->11001100

-53<--->11001011

-54<--->11001010

-55<--->11001001

-56<--->11001000

-57<--->11000111

-58<--->11000110

-59<--->11000101

-60<--->11000100

-61<--->11000011

-62<--->11000010

-63<--->11000001

-64<--->11000000

-65<--->10111111

-66<--->10111110

-67<--->10111101

-68<--->10111100

-69<--->10111011

-70<--->10111010

-71<--->10111001

-72<--->10111000

-73<--->10110111

-74<--->10110110

-75<--->10110101

-76<--->10110100

-77<--->10110011

-78<--->10110010

-79<--->10110001

-80<--->10110000

-81<--->10101111

-82<--->10101110

-83<--->10101101

-84<--->10101100

-85<--->10101011

-86<--->10101010

-87<--->10101001

-88<--->10101000

-89<--->10100111

-90<--->10100110

-91<--->10100101

-92<--->10100100

-93<--->10100011

-94<--->10100010

-95<--->10100001

-96<--->10100000

-97<--->10011111

-98<--->10011110

-99<--->10011101

-100<--->10011100

-101<--->10011011

-102<--->10011010

-103<--->10011001

-104<--->10011000

-105<--->10010111

-106<--->10010110

-107<--->10010101

-108<--->10010100

-109<--->10010011

-110<--->10010010

-111<--->10010001

-112<--->10010000

-113<--->10001111

-114<--->10001110

-115<--->10001101

-116<--->10001100

-117<--->10001011

-118<--->10001010

-119<--->10001001

-120<--->10001000

-121<--->10000111

-122<--->10000110

-123<--->10000101

-124<--->10000100

-125<--->10000011

-126<--->10000010

-127<--->10000001

-128<--->10000000 在这里

127<--->01111111

126<--->01111110

125<--->01111101

124<--->01111100

123<--->01111011

122<--->01111010

121<--->01111001

120<--->01111000

119<--->01110111

118<--->01110110

117<--->01110101

116<--->01110100

115<--->01110011

114<--->01110010

113<--->01110001

112<--->01110000

111<--->01101111

110<--->01101110

109<--->01101101

108<--->01101100

107<--->01101011

106<--->01101010

105<--->01101001

104<--->01101000

103<--->01100111

102<--->01100110

101<--->01100101

100<--->01100100

099<--->01100011

098<--->01100010

097<--->01100001

096<--->01100000

095<--->01011111

094<--->01011110

093<--->01011101

092<--->01011100

091<--->01011011

090<--->01011010

089<--->01011001

088<--->01011000

087<--->01010111

086<--->01010110

085<--->01010101

084<--->01010100

083<--->01010011

082<--->01010010

081<--->01010001

080<--->01010000

079<--->01001111

078<--->01001110

077<--->01001101

076<--->01001100

075<--->01001011

074<--->01001010

073<--->01001001

072<--->01001000

071<--->01000111

070<--->01000110

069<--->01000101

068<--->01000100

067<--->01000011

066<--->01000010

065<--->01000001

064<--->01000000

063<--->00111111

062<--->00111110

061<--->00111101

060<--->00111100

059<--->00111011

058<--->00111010

057<--->00111001

056<--->00111000

055<--->00110111

054<--->00110110

053<--->00110101

052<--->00110100

051<--->00110011

050<--->00110010

049<--->00110001

048<--->00110000

047<--->00101111

046<--->00101110

045<--->00101101

044<--->00101100

043<--->00101011

042<--->00101010

041<--->00101001

040<--->00101000

039<--->00100111

038<--->00100110

037<--->00100101

036<--->00100100

035<--->00100011

034<--->00100010

033<--->00100001

032<--->00100000

031<--->00011111

030<--->00011110

029<--->00011101

028<--->00011100

027<--->00011011

026<--->00011010

025<--->00011001

024<--->00011000

023<--->00010111

022<--->00010110

021<--->00010101

020<--->00010100

019<--->00010011

018<--->00010010

017<--->00010001

016<--->00010000

015<--->00001111

014<--->00001110

013<--->00001101

012<--->00001100

011<--->00001011

010<--->00001010

009<--->00001001

008<--->00001000

007<--->00000111

006<--->00000110

005<--->00000101

004<--->00000100

003<--->00000011

002<--->00000010

001<--->00000001

000<--->00000000



  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在C++负数通常使用补码表示。如果你想要获取一个负数内存存储的值,可以使用以下代码: ```cpp #include <iostream> #include <cstring> void printNegativeNumberMemoryValue(int num) { // 将负数的值拷贝到一个字符数组 char* numPtr = reinterpret_cast<char*>(&num); // 输出字符数组的每个字节的十六进制值 for (size_t i = 0; i < sizeof(num); i++) { std::cout << "Byte " << i << ": " << static_cast<int>(numPtr[i]) << std::endl; } } int main() { int negativeNum = -10; printNegativeNumberMemoryValue(negativeNum); return 0; } ``` 在上述代码,我们定义了一个`printNegativeNumberMemoryValue`函数,该函数接受一个负数作为参数。在函数内部,我们将负数的值拷贝到一个`char`类型的指针,并使用`reinterpret_cast`进行类型转换。然后,我们遍历字符数组的每个字节,并使用`std::cout`输出每个字节的十六进制值。 在`main`函数,我们示例传入了一个负数-10,并调用`printNegativeNumberMemoryValue`函数来输出负数内存存储的值。 需要注意的是,这里假设对于`int`类型,使用补码表示负数。实际上,整数的表示方式可能因编译器和平台而异,所以这里的代码仅适用于使用补码表示负数的情况。另外,这里使用了`reinterpret_cast`进行类型转换,因为将`int`类型的指针直接转换为`char*`类型的指针是一种未定义行为,而`reinterpret_cast`可以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值