符号计算

原码,补码,反码

会有一股神秘感。 提交于 2020-02-28 04:17:12
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值,正数的符号位为0,负数的符号位为1, 比如如果是8位二进制: [

理解有符号数和无符号数

陌路散爱 提交于 2020-02-28 04:10:10
http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html 声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数: 11111111 双字节数:

Entertaining Geodetics

我的未来我决定 提交于 2020-02-27 19:46:34
题目虽然是要求是按螺旋的更改地板的颜色 但是即使是按螺旋的方式更改那么也是地图中所有的地板的颜色都会改变 可以将有什么颜色的地板的数量都记录下来然后算更改的次数的时候只要加上要更改的地板的数量并把刚才更改的那一种颜色的地板数量加到符号颜色的地板的数量上 并把刚才的数量清空 也就是求入队的顺序的问题了 首先先比较层数的大小 层数大的肯定放在层数小的后面 即绿色的放在 红色的后面 接下来就是同一层的比较了 首先是全在最左边一列的时候那么就只要比较一下x坐标就行了 如果一个在最左列 一个在其他的列那么肯定是最左列的放在后面 同理比较一下最上面的一行 然后就是右边一列 和最下面一行的情况 也是差不多的。 /* 问题描述   在此游戏中地图被分为了许多叫作Geo格的正方形方格,其中一些被涂上色,假设没有涂色的为透明色。   地图中还有些Geo符号,它们样子像不同颜色的金字塔(包括透明Geo符号)。每个Geo符号都坐落在Geo格上,每个Geo格上最多一个Geo符号。   Geo符号可以被消除。为了更好地理解Geo符号在消除时发生了什么,这里引入把刚消除的Geo符号放入的队列。   从队列中取出Geo符号,观察包含Geo符号的Geo格的颜色,如果它不是透明的且颜色不同于Geo符号,则把所有这个颜色的Geo格重新涂为Geo符号的颜色(透明的Geo符号则为透明色)

LLDB调试器

佐手、 提交于 2020-02-27 12:34:42
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNumber *n = @7; // 实际应该调用这个函数:Foo(); 或者短路一个逻辑检查? if (1 || theBooleanAtStake) { ... } 或者伪造一个函数实现? int calculateTheTrickyValue { return 9; /* 先这么着 ... } 并且每次必须重新编译,从头开始? 构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。 但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。 这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。 LLDB LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的 开源 调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。

7-1 打印沙漏

强颜欢笑 提交于 2020-02-27 07:33:51
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“ ”,要求按下列格式打印 **** *** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。 输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。 输入样例: 19 * 输出样例: ***** *** 2 实验代码 #include <stdio.h> #include <math.h> int main() { int i=1,y,n,x=1,a,z,b,l,e; char c; scanf("%d %c",&y,&c); while(2*x-1<=y){ i=i+2; x=x+i; } i=2-i; n=2-i; while(i<fabs(n)){ for(z=1;z<(fabs(n)-fabs(i))/2;z++){ printf(" "); } for(b=1;b<=fabs(i);b++) { printf("%c",c); } printf("\n"); if(i!=-1){ i=i+2; } else{ i

7-1 打印沙漏 编程总结

萝らか妹 提交于 2020-02-27 07:32:48
7-1 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。 输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。 输入样例: 19 * 输出样例: ***** *** * *** ***** 2 实验代码 #include<stdio.h> int main(void) { int n, i, sum; char ch; scanf("%d %c", &n, &ch); i=1; //代表层数 sum=1; //代表沙漏需要的字符个数 while(sum<=n) { sum+=2*(2*(i+1)-1); //2n-1是一层的个数,乘以2代表两层一共需要的 if(sum<=n) i++; } int s,m; for(s=0;s<i;s++) //打印上半部分 { for(m=0;m<s;m++) printf(" "); //输出空格 for

PTA编程总结1:打印沙漏

岁酱吖の 提交于 2020-02-27 07:32:01
---恢复内容开始--- 7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: 输入在一行给出1个正整数N( ≤1000)和一个符号,中间以空格分隔。 输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。 输入样例: 19 * 输出样例: ***** *** * *** ***** 2 1).实验代码 #include <stdio.h> int main () { int n; char c; printf("输入数字和*用空格隔开比如:17 *:"); scanf("%d %c",&n, &c); int y=0, N=-1, M=0, x=1, a, i, b, f, sum=0; //下面的循环,判断加了几次,得出第一行有几个字符 while(1) { N=N+2; M++; y=y+N; if(n-2*y+1==0) //刚好相等,跳出循环 { break; } if(n-2*y+1

c语言助记

爱⌒轻易说出口 提交于 2020-02-26 19:19:39
1.常量定义,不可修改: ①宏定义常量(推荐) #define PI 3.14159 ②普通定义常量(不安全) ,const int a=5; 2.浮点型保留2位小数使用 printf("price==%.2f",price); %.2f为占位符 3.有符号(signed)和无符号区别: ①有符号关键字一般可以省略 signed int a=-10/10;可以是正数也可以是负数 ②无符号的只能用正数 4.十/八/十六进制定义 int a =10; int b=01234;(不能出现超过8的数字) int c=0xAd; 5.sizeof(int/变量名) 计算数据类型在内存中占的字节大小 来源: CSDN 作者: 星眸之心 链接: https://blog.csdn.net/wangguidong520/article/details/104522122

JVM学习——字节码(学习过程)

旧街凉风 提交于 2020-02-23 12:23:15
JVM——字节码 为什么要学字节码 字节码文件,有什么用? JVM虚拟机的特点:一处编译,多处运行。 多处运行,靠的是.class 字节码文件。 JVM本身,并不是跨平台的。Java之所以跨平台,是因为JVM本身不夸平台。 二进制的文件,显然不是给人看的。是给机器看的。 从根源了解了之后,返回到语言层次 好多都会豁然开朗。 必须要学,学一个东西,还需要理由吗? Java语言规范补充: JVM虚拟机规范(相对底层的)Java,Groovy,kotlin,Scala。 编译后都是Class文件,所以就都能在JVM虚拟机上运行。 字节码:枯燥且重要 字节码文件解读 一个Java类,然后进行编译成字节码文件 package com.dawa.jvm.bytecode; public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } javap 编译后的结果: ➜ main javap com.dawa.jvm.bytecode.MyTest1 Compiled from "MyTest1.java" public class com.dawa.jvm.bytecode.MyTest1 { public com.dawa

浮点数的表示方法(转,修改)

浪子不回头ぞ 提交于 2020-02-23 10:14:02
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为: 以下120的二进制表示错误了应该是111 1000 R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25* ,而120.5可以表示为:1.205* ,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为