精华内容
下载资源
问答
  • C语言中有符号数和无符号数的问题

    千次阅读 2019-04-26 01:08:23
    C语言中有符号数和无符号数的问题 项目说明     考虑下列代码, 这段代码试图计算数组a所有元素的和, 其中元素的数量由参数length给出: 1 /* WARNING: This is buggy code */ 2 float sum_elements(float a...

    C语言中有符号数和无符号数的问题

    项目说明

        考虑下列代码, 这段代码试图计算数组a中所有元素的和, 其中元素的数量由参数length给出:

     /* WARNING: This is buggy code */
     float sum_elements(float a[ ], unsigned length){
         int i;
         float result = 0;
         for (i=0; i<=length-1; i++)
             result += a[i];
         return result;
     }
    
    1. 请分析这段程序,当参数length等于0时, 运行这段代码应该返回的值是多少?
    2. 运行这段代码,当参数length等于0时,实际会产生什么结果?
    3. 请解释你的实际运行的结果产生的原因。
    4. 修改代码以得出正确的结果。

    项目报告

    问题1:分析这段程序,当参数length等于0时, 运行这段代码应该返回的值是多少?

    我们可以看一下该程序代码的流程图:
    在这里插入图片描述
        很容易分析当length等于0时,for循环中i<=length-1条件不成立,循环体内的语句不会执行,该函数应该返回的result的初始值0。

    问题2:运行这段代码,当参数length等于0时,实际会产生什么结果?

        我们在不同的编译器下运行了此段代码:

     #include <stdio.h>
     float sum_elements(float a[], unsigned length)
     {
         unsigned i;
     	 float result = 0;
     	 for (i = 0; i <=length-1; i++)
     		 result += a[i];
     	 return result;
     }
    
     int main()
     {
         float a[] = {1.7, 2.6, 4.1};
    	 float ret = sum_elements(a, 0);
    	 printf("%.lf", ret);
    	 return 0;
     }
    

    结果如下:

    1. 使用远古编译器Turbo C运行此程序,Compile时没有报错,Run时黑屏无结果,并显示 cpu speed max 100% cycles,Frameskip 0,Program TC。CPU占用100%。
      在这里插入图片描述
    2. 使用Dev c++ GCC 4.8.1编译运行此程序,没有产生警告,进程停止,命令行显示Process exited with return value 3221225477
    3. 使用Microsoft Visual Studio 2012/2017编译运行此程序,程序虽然运行成功,但并没有得到正确的运行结果,程序运行了几秒钟后在命令行上输出请按任意键继续的结果,并在控制台区报出警告:warning C4018: “<=”: 有符号/无符号不匹配。我们对float ret = sum_elements(a, 0);代码打断点进行程序调试,弹出提示框,显示0x011E14F3 处有未经处理的异常(位于 PBL.exe 中): 0xC0000005: 读取位置 0x0200000 时发生访问冲突
      在这里插入图片描述
    4. 使用中国大学MOOC浙江大学的网页编译器运行此程序,编译器报错:
      Error:Memory space at 0x100004(object ‘*(a+1)’) is not initialized
      Result += a[i];

    问题3:请解释你的实际运行的结果产生的原因。

        经查阅资料知,C语言中在有符号类型和无符号类型数据之间测试相性时,编译器会隐性地将有符号的int类型升级为无符号的unsigned int类型。
        回到本题中,在执行语句i<=length-1时,因为length是unsigned int类型,所以参与运算的参数都被隐式地被强制转换为unsigned int类型。在主函数中,通过执行float ret = sum_elements(a, 0);语句,使得形参length=0,运算length-1 = 0-1 = -1,-1转换成 unsigned int 的结果是一个非常巨大的正整数的,这就是实际运行结果产生的原因。
        接着,我们来分析一下这个巨大的正整数,要知道整数在计算机中通常是以二进制补码的形式存在的,而-1的无符号补码(以32位为例)为0xFFFFFFFF,这是32位无符号整数能表示的最大值:232-1,即4294967296。因为232-1足够大,所以我们尝试将代码float ret = sum_elements(a, 0);中的0改为0xFFFFFFF在Microsoft Visual Studio 2012上进行程序调试运行,得到的结果和没有修改前的结果是一样的。
        所以我们得出结论,运行该程序报错或者得不到运行结果的原因是执行从0到0xFFFFFFFF的循环时,数组下标越界,内存读写异常,在vs 2012/2017等较新的编译器中,并没有出现错误,而Turbo c中没有检测机制,会输出了-NAN的运行结果,经过查阅是不可表示的值。
    在这里插入图片描述

    问题4:修改代码以得出正确的结果。

        通过分析代码错误的产生原因,经小组讨论,共得到4组代码:

    • 代码1
    // 把unsigned 修改成有符号数int
    float sum_elements(float a[ ], int length)
    {
       int i;
       float result = 0;
       for (i=0;i<=length-1;i++)
       	result +=a[i];
       return result;
    }
    
    • 代码2
    // 提前判断length是否为0,如果是直接return result;
    float sum_elements(float a[ ], unsigned length)
    {
       int i;
       float result = 0;
       if(length <= 0)
           return  result;
       for (i=0;i<=length-1;i++)
       	   result +=a[i];
       return result;
    }
    
    • 代码3
    //把 i<=length-1改成 i<length
    float sum_elements(float a[ ], unsigned length)
    {
       int i;
       float result = 0;
       for (i=0;i<length;i++)
           result +=a[i];
       return result;
    }
    
    • 代码4
    // 使用强制类型转换 i<=(int)length-1
    float sum_elements(float a[ ], unsigned length)
    {
      int i;
      float result = 0;
      for (i=0;i<(int)length-1;i++)
          result +=a[i];
      return result;
    }
    

        新人发文,欢迎大家批评指正!

    展开全文
  • 调试方法描述: 1.进入windows下的DOSBOX虚拟机环境。 2.调用文本编辑程序EDIT建立汇编源文件(后缀名为.asm)。 3.用汇编程序ml对源文件汇编产生目标文件(后缀名为.obj)。 ...4.用连接程序link产生可执行文件...

    调试方法描述

    1.进入windows下的DOSBOX虚拟机环境。

    2.调用文本编辑程序EDIT建立汇编源文件(后缀名为.asm)。

    3.用汇编程序ml对源文件汇编产生目标文件(后缀名为.obj)。

    4.用连接程序link产生可执行文件(后缀名为.exe)。

    5.执行程序。

    6.查看列表文件(后缀名为.lst)。

    7.使用调试软件windbg调试程序。

    上机代码:

    (文件ex1.asm):

    code segment

    assume cs:code

     

    mov ax,32

    mov bx,74

    mov cx,23

     

    sort: cmp ax,bx

    jge X          ;如果ax大于等于bx就跟cx比较

    xchg ax,bx

    X:cmp ax,cx       ;如果ax大于cx

    jge Y

    xchg ax,cx

    Y:int 21h

    mov ax,4c00h

    code ends

    end sort

     

    展开全文
  • 2015年3月8日追加一点:今天看这个地方有些不明白在网上搜了一下资料发现,无符号数相减,如果被减数小于减数,那么结果会是一个非常大的无符号数,而不是一个想象有符号数。所以对于无符号数相减之前需要进行...
    1. #include<stdio.h>  
    2. void main()  
    3. {  
    4.  int l=-1;  
    5.  unsigned int c=135;  
    6. printf("%u\n",l+c);  
    7. }  
    这个的结果134,而不是我之前认为的很大的正数,实际上需要注意的是-1(0xffffffff)被提升为unsigned int后是一个差1就溢出的unsigned int,所以相加后结果是134。但是如果l=-10000,那么结果就真是一个很大的正数了,因为不涉及溢出了。
    C语言中存在两种整数算术运算,有符号型和无符号型。无符号数运算:所有无符号数运算都是以2的n次方为模,(n是结果中的位数)。所以它不存在运算时的没有那种所谓的“溢出”,当它超过范围时,从零开始重新计数!当一个无符号数和有符号数计算的时候,有符号数会自动转化为无符号数参与运算!有符号数运算: 是可能发生“溢出”的,而且“溢出”的结果不固定。

         关于无符号数减去无符号数的用法错误:

    if ( i - j >=0) 假如i,j为无符号数,这样写可能会引发错误,即当i小于j的时候,这个式子仍然成立,因为无符号数始终是大于等于零的。例: if ( strlen( a ) >= 10) 与 if (strlen ( b ) -10 >= 0) 这两条语句是不相等的 ,因为strlen函数返回的是无符号数类型。

    2015年3月8日追加一点:今天看这个地方有些不明白在网上搜了一下资料发现,无符号数相减,如果被减数小于减数,那么结果会是一个非常大的无符号数,而不是一个想象中的有符号数。所以对于无符号数相减之前需要进行判断,最好做比较的时候使用 if ( strlen( a ) >= 10) 这种方式,而不要使用if (strlen ( b ) -10 >= 0) 这种方式。因为无符号数进行计算的结果还是无符号数;另外无符号数和有符号数计算时,有符号数会被强制转提升无符号数。

    例如以下这个例子很有意思:

    1. #include<stdio.h>   
    2. int main()   
    3. {   
    4. unsigned int a=6;   
    5. int b=-20;   
    6. printf("%d\n",(a+b)>0);   
    7.   
    8. }   

    这个小例子可以机器试一下。另外还有几道题不错我也附在最后。

    需要注意一点,我在进行程序编写的时候发现一个小问题:


    那么unsigned char与signed int相减呢?

    1. #include<stdio.h>  
    2. void main()  
    3. {  
    4.  unsigned char a;  
    5.  int b;  
    6.  a=0;  
    7.  b=2;  
    8.  printf("X=%d\n",(a-b)>0);  
    9. }  

       ANSI C规定在无符号整数和有符号整数之间进行强制类型转换时,位模式不应该改变。类型转换并未改变对象的位模式,改变的是位模式的解释方式

        有符号数转换为无符号数时,负数转换为大的正数(可以理解为原值加上2的n次方),而正数保持不变。

        无符号数转换为有符号数时,对于小的数将保持原值,对于大的数则转换为负数(可以理解为原值减去2的n次方)。


    今晚在看C的时候突然想到如果把大于unsigned int的范围的数据赋予 该类型变量,printf出来会是什么样。

    1. void main()  
    2. {  
    3.   unsigned int a;  
    4.   a=7000000000;  
    5.  printf("a=%d\n",a);  
    6.  printf("a=%u\n",a):  
    7. }  

    这两个结果是完全不一样的。


    几个小例子:

    题目一:

    int a = -1;

    unsigned int b = 1;

    printf("%d", a > b);

    结果输出:1

    因为无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。a转化为无符号数后就是0xFFFFFFFF,肯定大于b

    题目二:

    char a = -1;

    unsigned char b = 1;

    printf("%d", a > b);

    结果输出:0

    奇怪了,怎么会这样?这是因为两者被提升为int了,a提升为int就表示-1,b提升为int 就是1,前者小于后者。注意了这里不是像题目一里一样简单的把char转化为unsigned char了

    题目三:

    int a = -1;

    unsigned char b = -1;

    printf("%d\n", a < b);

    结果输出是:1

    原因在于要把b提升为int就是255当然大于-1了,unsigned char 先提升为int,送入int的低八位中,高位全部补零。

    题目四:

    char a = -1;

    unsigned int b = -1;

    printf("%d\n", a == b);

    结果输出:1

    原因是char类型被扩展为unsigned int后与b相等,同为0xFFFFFFFF

    小于int的提升到int,int之后都是从signed -> unsigned

    对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。

    一定要记住如果需要使用有符号数时不要忘记强制转换

    展开全文
  • 例题:下列给定程序,函数fun的功能是:统计一个无符合整数各位数字值为0的个数,通过形参传回主函数,并把该整数各位上最大的数字值作为函数值返回。 例如。若输入无符号整数10080,则数字值为0的个数为3,...

    例题:下列给定程序中,函数fun的功能是:统计一个无符合整数中各位数字值为0的个数,通过形参传回主函数,并把该整数中各位上最大的数字值作为函数值返回。

    例如。若输入无符号整数10080,则数字值为0的个数为3,各位上数字值最大的是8。
    注意:不要改动main函数,不能增行或删行,也不能更改程序的结构。

    代码如下:

    #include<stdio.h>
    int fun(unsigned m,int*z)
    {
    	int n=0,max=0,t;
    	do
    	{
    		t=m%10;
    		if(t==0)
    			n++;
    		if(max<t)
    			max=t;
    		m=m/10;
    	}while(m);
    	*z=n;
    	return max;
    }
    main()
    {
    	unsigned m;
    	int z,max;
    	printf("\nInput m(unsigned):");
    	scanf("%d",&m);
    	max=fun(m,&z);
    	printf("\nThe result:max=%d z=%d\n",max,z);
    }
    

    输出运行窗口如下:
    在这里插入图片描述
    本周其他练习

    C语言程序设计专栏

    C语言编程>第二十三周 ① 下列给定程序中,函数fun的功能是:求n!(n<20),所求阶乘的值作为函数值返回。例如,若n=5,则应输出120。

    C语言编程>第二十三周 ② 请补充fun函数,该函数的功能是:交换数组a中最大和最小两个元素的位置,结果重新保存在原数组中,其它元素位置不变。注意数组a中没有相同元素。

    C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入到前两个字符中,插入后前三个字符依然有序;再把第四个字符插入到前三个字符中……待排序的字符串已在主函数中赋予。

    C语言编程>第二十三周 ④ 请补充fun 函数,该函数的功能是:删除字符数组中比指定字符小的字符,指定字符从键盘输入,结果仍保存在原数组中。

    C语言编程>第二十三周 ⑤ 请补充main函数,该函数的功能是:求1~100(不包括100)以内所有素数的平均值。

    C语言编程>第二十三周 ⑥ 下列给定程序中函数fun的功能是:删除字符串s中的所有空白字符(包括Tab字符、回车符及换行符)。输入字符串时用 “#”结束输入。

    C语言编程>第二十三周 ⑦ 请补充main函数,该函数的功能是:求n!。

    C语言编程>第二十三周 ⑧ 下列给定程序中,函数fun的功能是:统计一个无符合整数中各位数字值为0的个数,通过形参传回主函数,并把该整数中各位上最大的数字值作为函数值返回。

    越努力越幸运!
    加油,奥力给!!!

    展开全文
  • 例题:下列给定程序中函数fun的功能是:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在b中。高位仍在高位,低位仍在低位。 例如,当a中的数为123456时,则b中的数为246。 注意:不要改动main函数,不能...
  • 疫情天天在家上网课 发现知识他不进脑子啊 突然发现自 己作业不会写了... 负数的反码是原码符号位不变,其他位取反 例题 设机器数字长为8位(含1位符号位在内),写出对应下列各真值的原码、补码和反码。 -26/128,82
  • /* 程序头部注释开始(为避免提交博文遇到的问题,将用于表明注释的斜杠删除了) * 程序的版权和版本声明部分 ...* 问 题: 在下面的加法算式,不同的符号代表不同的数字,相同的符号代表相同的数字。 *
  • 数据挖掘所需的概率论与数理统计知识

    万次阅读 多人点赞 2012-12-17 19:24:47
    梳理到概率论与数理统计的相关知识,但本文之压轴戏在本文第4节(彻底颠覆以前读书时大学课本灌输给你的观念,一探正态分布之神秘芳踪,知晓其前后发明历史由来),相信,每一个学过概率论与数理统计的朋友都...
  • 编写程序:将一个包含20个有符号数据的数组arrayM分成两个数组,正数数组arrayP 和负数数组arrayN,并分别把两个数组的数据个显示出来 DATA SEGMENT M DB -1,-2,-3,-4,-5,-6,-7,-8,-9,0,-10,-11,-12,-13,-14,-...
  • python时间日期格式化符号

    千次阅读 2017-03-02 12:35:38
    %d 月内的一天(0-31) %H 24小时制小时(0-23) %I 12小时制小时(01-12) %M 分钟(00=59) %S 秒(00-59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c ...
  • (1)双操作有符号乘指令 语句格式 :IMUL OPD ,OPS 功 能 :(OPD)*(OPS)---->OPD 其中OPD可为16/32的寄存器,OPS可为同类型的寄存器、存储器操作或立即。 (2)3个操作有符号乘指令 语句...
  • 符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: 输入在一行给出1个正整数N(≤1000)和一...
  • 6.for i in range(2,n):if n%i==0:breakif i==n-1:print('是素数')...8.对于else子句的for循环和while循环,但循环因循环条件不成立而自然结束时__会__(会或不会)执行else的代码。10.已知x='hello world.',那...
  • Latex相关符号

    千次阅读 2017-03-23 22:30:11
    函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} latex数学符号表(2)" style="border:none; max-width:100%"> \acute{\eta} latex数学符号表(2)" style="border:none; max...
  • 本题要求你写个程序把给定的符号打印成...符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式...
  • 相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 输入格式: 输入在一行给出1个正...
  • 函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} \dot{x} \hat{\alpha} \t...
  • linux shell 各种符号的含义

    千次阅读 2017-05-18 16:13:50
    在Linux Shell中有很多的特殊符号,这对于我们写Shell脚本时要特别留意:一方面要知道这些特殊符号的用法,这些符号用好了可以达到事半功倍的效果;但另一方面要避免这些特殊符号的过度使用而导致脚本难以调试、难以...
  • linux 特殊符号用法详解

    万次阅读 2013-07-17 21:47:14
    井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。 # This line is comments. echo "a = $a" # a = 0 由于这个特性,当临时不想执行某行指令时,只需在该行...
  • 发现有符号数和无符号数,如果都是正数的话,二进制值是一样,因此不能简单地和0比较。具体代码,如下: #include #include using namespace std; #define ISUNSIGNED(a) (((a) | 0x1 0) #define ISUNSIGNED_...
  • 所以,Burr是下列事情的始作俑者:迫使我们想出“Wohao5huA!”或者“P@55w0rd”这样折磨打字人的密码;迫使我们记住像“Uj3k@u90”这样的系统分配密码;根据公司IT部门的要求,90天,更换一次密码。 现在,Burr承认...
  • shell脚本一些特殊符号

    千次阅读 2018-11-12 10:57:55
    这篇文章主要介绍了shell脚本一些特殊符号,需要的朋友可以参考下 在shell常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"string\"* ** ? : ^ $# $@ `command`{} [] [[]] ...
  • \1 表示后向引用,是指在正则表达式,从左往右,第1个()的内容,以此类推,\2表示第2个(),\0表示整个表达式。 //匹配日期格式,表达式的\1代表重复(\-|\/|.) var rgx = /\d{4}(\-|\/|.)\d{1,2}\1\d{1...
  • 计算机定点表示方法练习

    千次阅读 2020-02-27 11:35:01
    1【单选题】针对8位二进制,下列说法正确的是 。(5.0分) A、-127的补码为10000000 B、-127的反码等于0的移码 C、+1的移码等于-127的反码 D、0的补码等于-1的反码 正确答案: B 2【单选题】若某x的真值为-0....
  • LaTeX 各种命令,符号

    万次阅读 多人点赞 2016-06-12 15:27:42
    函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} latex数学符号表(2)" style="border:none; max-width:100%"> \acute{\eta} latex数学符号表(2)" style="border:none; max...
  • 如果存在,则将用已本地化的减号(在多数语言环境中是  '-' )作为前缀的正数子模式用作负数子模式。也就是说,单独的  "0.00"  等效于  "0.00;-0.00" 。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;...
  • 从字母数字字符串提取数字

    千次阅读 2014-09-30 10:43:06
    本文的作者是 Ashish Mathur,是一位 Microsoft MVP(最价值专家)。有关详细信息,请访问 Microsoft MVP 网站(英文)。 在下文中,我将说明从以下各种情况的字符串内提取数字的公式: 当字母字符和数字...
  • 集合论的阿列夫

    千次阅读 2018-09-23 19:18:27
    在集合论,阿列夫,又称艾礼富,是一连串超穷基数。其标记符号为 ℵ (由希伯来字母א‎(aleph)演变而来)加角标表示。 可集(包括自然数)的势标记为{\displaystyle \aleph _{0}},下一个较大的势为{\...
  • 程序,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。也就是说,只要掌握了使用二进制来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了。那么,为什么计算机处理的信息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,490
精华内容 41,796
关键字:

下列有符号数中最大的数是