首页天道酬勤()

()

admin 11-29 10:46 179次浏览

我们都知道计算机中的所有数据最终都会转换成0和1,磁盘中也有0和1。不知道大家有没有问题,负数怎么存储?刚才我们也说了,所有的数据都会存储为0和1,所以我们的“-”减号也转换成了,因为我们的减号不能在磁盘中存储为“-”。

事实上,在我们的计算机中,在访问数据时,我们基本上会说类型的最高位是为我们的符号留出的,然后规定如下:如果是有符号的数据类型,最高位是1,这意味着这个数字是负数,如果是0,这意味着这个数字是正数。

签名关键字

修改后的变量描述已签名。当我们从内存中获取这个变量时,我们应该根据最高值是0还是1来判断数据是正还是负。

在这种情况下,我们的32位有符号int型整数只能表示-2 ^ 31 ~((2 ^ 31)-1)和8位char型数的范围,其值表示-2 ^ 7 ~((2 ^ 7-)1)的范围。不管怎样,我们应该记住签名的数据。判断值的时候要舍弃最高位,因为它不是值,而是正的或者负的。

无符号关键字

再来说说我们的无符号整数数据。当被这个关键字修改时,意味着数据是无符号的,我们得到的所有数据都是实值。

我们的32位无符号int可以表示范围从0 ~ (2 32)-1的值,我们的8位无符号char类型范围从0 ~ ((2 8)-1)。

可能我们在声明变量的时候,很少用这两个关键词来修饰变量。更多时候,我们开始直接定义变量,比如int chat float.那么这个时候,不管是有符号的还是无符号的数据类型,其实如果我们没有假关键字,系统默认会给我们添加一个有符号的类型,所以你可以忽略它的存在,但是需要注意的是,我们的(char)类型数据编译器不会自动给你添加。

有趣的代码

1 # includestdio.h

2 #包括estring.h

5 int main()

6 {

7签名char a[100];

8 int I;

9表示(I=0;i512(一)

10 {

11

12a[I]=-1-I;

13 //printf('a[%d]=%d ',I,a[I]);

14 printf('%d ',a[I]);

15 if(((I)1)8)==0)

16 printf(' \ n \ n ');

17 }

1printf ('\ nArray长度%ld\n ',strlen(a));

19返回0;

20 }

结果分析

你认为这段代码的最终结果会是什么?我们很多人一看,是数组的长度,是不是100?但我想告诉你的是,代码是255。为什么呢?

我们先来分析一下程序是如何工作的。在for循环中,当I的值为0时,值为-1。关键是我们需要知道我们的-1是如何存储在我们的计算机中的。我们所有接触过计算机系统的人都知道,计算机中存储的所有数据都是以补码的形式存储的。主要原因是使用补码可以统一我们的符号位和其他位,同时减法也可以通过加法来处理。当其他两个补码表示数字相加时,如果最高位(符号位)有进位,进位将对齐。正数的补码与原代码相同。我们有负数的补码:符号位为1,其他位为数字原码的绝对值,然后将整数加1;

计算机中的负一

根据我们的负补码规则,我们可以知道-1的补码是0xff,-2,而-2的补码是0xfe…….

让我们看看,如果是八位系统,我们是负一,最高位是1。

第一步:1000万

第二步,我们的-1的绝对值是1,原码是0000 0001。

第三步是按位反转:1111 1110。

第四步:添加1: 1111 1111

这里,我们的-1的补码表示系统中有八个1。此时,让我们验证我们知道(-1) 1=0

我们的:(1111 1111) 1=?

No: 0000 0000都是零,和我们计算的一样。

回到前面的步骤。

当I的值为127时,a[127]的值为-128 (1000001),这是char数据可以表示的最小负数。当我继续增加a[128]时,它的值绝对不是-129。

,因为这时候发生溢出了呀,-129我们是需要9位才能存下来,但是我们的char类型只有8位,所以这时候最高位的符号位被丢弃了,剩下的8位是原来9位补码的低8位的值 0x7f(0 111 1111)(127) 这时候值是127 然后我们的i继续走 执行(-1-i)=126,(0111 1110)……直到变为0000 0000 ,这时候随着i的增加我们的 a的值有编程了最开始的 (-1-0)=-1(1111 1111)然后(-1-1)=-2(1111 1110)说起来比较绕我们看看程序跑的结果我们可以分析出来程序是怎么跑的了。

回到刚刚的-129的时候,我们把最高位丢弃,然后就变成了0x7f ,当我们的i继续增加到255的时候,-256的补码的低位为0,然后当i增加到256的时候,-127的补码全为1,低8位的补码为0xff,如此新的一轮循环开始……

结论

按照我们上面的分析a[0]~a[254]里面的值都是不为0的,而a[255]的值为0,strlen函数是计算我们字符串长度的并不包含字符串后面的“\0”,判断一个字符串的结束标志的是有没有遇到“\0”,如果遇到了就停止计算了。所以我们说到这里我们的值为什么是255应该清楚了吧。但是今天并不是要讨论strlen的用法,希望大家知道的是signed char 类型范围是[-128,127]超出这个范围就会溢出了。另外你还要清楚负数的补码该怎么表示和计算。

哎呦终于说完了,你们慢慢消化吧,有什么想法可以说出来大家一起学习一下!

怎么查看git分支从哪个源分支拉的(03)_k8s之flannel三种模型安装部署详解怎么用Java比较两个对象的大小分布式版Redis架构 云内存 UMem RedisJava设计模式之原型模式怎么实现将“^^”替换为“^”
c语言补码是什么(c语言输出一个数的补码) 快速翻书(正在准备计算机请不要关机)
相关内容