精华内容
下载资源
问答
  • C语言输出负数

    2014-04-03 22:40:18
    有一个方程,比如说ax+by+c=0,给定a,b,c参数不同的值,进行输出。但是如果b为负数,比如-1,就会输出2x+(-1)y+3=0。这种情况应该如何处理,不使用条件判断语句,如果为负数,则输出2x-y+3=0。望各位大神指教。
  • C语言输出负数补码

    万次阅读 2017-06-06 22:35:00
    C语言打印出负数补码 最近刚好复习到计组的定点数运算,想着以前写快速幂都是打印出正数的补码,从来没有打印过负数的补码,于是写了几行代码,加深对这方面的理解。要知道的知识 数值在计算机表示为补码表示,所以...

    C语言输出负数补码

    最近刚好复习到计组的定点数运算,想着以前写快速幂都是打印出正数的补码,从来没有输出过负数的补码,于是写了几行代码,加深对这方面的理解。


    要知道的知识

    • 数值在计算机表示为补码表示,所以在C语言里负数也是以补码存储的
    • 了解算术移位和逻辑移位的区别
    • 在第三版的神书CSAPP里面提到

      c语言标准并没有明确定义对于有符号数使用哪种类型的右移。不幸地,这就意味着任何假设一种或者另一种右移形式的代码都可能会遇到可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的

    • 任何二进制在机器表示都是一样的,只是c语言的不同类型对其解释不一样。unsigned 类型将最高位解读为数值位,但是像short,int之类的就把最高位解读为符号位。

    代码

    要想打印出负数的补码,只对负数右移是不行的,因为它进行的是算术右移,这样最终只会无穷无尽地右移为-1,那么我们就可以先把有符号转化为无符号,因为二进制是一样的,只不过无符号和有符号对二进制解读不一样,于是很快写出下面几行小代码

    #include <cstdio>
    
    int main()
    {
        int num[20], cnt = 0;
        short a = -4321;
        unsigned short b = a;
        printf("%d\n", b);
        while(b)
        {
            num[cnt++] = b & 1;
            b >>= 1;
        }
        for(int i = cnt - 1; i >= 0; i--)
            printf("%d ", num[i]);//结果可与2018王道计组复习P45页对比
        return 0;
    }
    
    展开全文
  • c语言负数输出问题

    2017-09-04 09:12:04
    在keil中-7输出的不是-7,而是65527,求怎么让他输出的是-7.
  • 自编的C语言程序为什么输入八位十六进制数的时候就会出现负值呢0#include #include #include #include /* 将十六进制字符转换为数值 */ int get_value(const char c) { if (c >= '0' && c <= '9') ...

    自编的C语言程序为什么输入八位十六进制数的时候就会出现负值呢0

    #include #include #include #include /* 将十六进制字符转换为数值 */ int get_value(const char c) { if (c >= '0' && c <= '9') return c - '0'; else return c - 'A' + 10;... #include

    #include

    #include

    #include

    /* 将十六进制字符转换为数值 */

    int get_value(const char c)

    {

    if (c >= '0' && c <= '9')

    return c - '0';

    else

    return c - 'A' + 10;

    }

    int main()

    {

    char* input,*ptr;

    int tmp,len,i;

    unsigned long int output1=0;

    input = (char *)malloc(sizeof(char)*8+1);/* 储存输入的十六进制数 */

    ptr = input;

    gets(input);

    len = strlen(input);

    for(i=0;i

    {

    tmp = get_value(*ptr);

    output1=output1+tmp*pow(16,(len-i-1));//转换成十进制

    ptr ++;

    }

    printf("%d\n",output1);

    free(input);

    return 0;

    } 展开 问题描述

    从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。

    注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

    样例输入

    FFFF

    样例输出

    65535

    展开全文
  • C语言输出整数的逆序数

    千次阅读 2020-03-12 13:48:02
    C语言 输出整数的逆序数 注意情况: 整数为负数; 整数的尾数为0。 #include<stdio.h> #include<math.h> int change(int n); int main() { int n; scanf("%d",&n); change(n);//运行函数将n...

    C语言 输出整数的逆序数

    更新,输入溢出的情况

    int类型:-2147483648<= x <= 2147483647
    231-1 ~ -231

    #include<stdio.h>
    #include<math.h>
    int change(int x);//预定义
    int main()
    {
    	int x;
    	scanf("%d",&x);
    	printf("%d\n", change(x));//运行函数将n逆序输出
    	
    	return 0;
    }
    
    int change(int x)
    {
    	long long int n = 0;
    	
        while(x != 0)
        {
            n = n*10 + x%10;//逐个加入尾数,并逐次*10
            x /= 10;
        }
    	//判断结果是否还是int类型,不是则返回0
    	return (int)n == n ? (int)n : 0;
    }
    

    关于整数逆置的几个方法

    (1)一个个数字读取,放在数组里(占空间但方便顺序/逆序输出)
    a[xxxx]
    
    (2)每提取出一个数字就输出(简洁)
    a%=10;
    printf("%d",a);
    
    (3)先提取每个数字,没提取一次就将之*pow(10,x),
    之后累加(容易将开头为0的去除,但要先求出数字的位数)
    
    	while(b)
    	{
    		b/=10;
    		count++;
    	}
    	
    	for(;n;count--)
    	{
    		a=n;
    		a%=10;
    		sum+=a*pow(10,count-1);
    		n/=10;
    	}
    	printf("%d",sum);
    }
    

    例图
    例图

    展开全文
  • C语言中的正负数及其输出

    千次阅读 2020-02-19 14:52:41
    C语言中也是一样,short、int、long 都可以带上正负号,示例 //负数 short a1 = -10; short a2 = -0x2dc9; //十六进制 //正数 int b1 = +10; int b2 = +0174; //八进制 int b3 = 22910; //负数和正数相加 long c =...

    在数学中,数字有正负之分。在C语言中也是一样,short、int、long 都可以带上正负号,示例

    //负数
    short a1 = -10;
    short a2 = -0x2dc9;  //十六进制
    //正数
    int b1 = +10;
    int b2 = +0174;  //八进制
    int b3 = 22910;
    //负数和正数相加
    long c = (-9) + (+12);
    

    如果不带正负号,默认就是正数。

    符号也是数字的一部分,也要在内存中体现出来。符号只有正负两种情况,用1位(Bit)就足以表示;C语言规定,把内存的最高位作为符号位。以 int 为例,它占用 32 位的内存,0~30 位表示数值,31 位表示正负号。
    在这里插入图片描述

    	在编程语言中,计数往往是从0开始,例如字符串 "abc123",我们称第 0 个字符是 a,第 1 个字符是 b,第 5 个字符是 3。这和我们平时从 1 开始计数的习惯不一样,大家要慢慢适应,培养编程思维。
    

    C语言规定,在符号位中,用 0 表示正数,用 1 表示负数。 int 类型的 -10 和 +16 在内存中的表示为:

    在这里插入图片描述
    short、int 和 long 类型默认都是带符号位的,符号位以外的内存才是数值位。如果只考虑正数,那么各种类型能表示的数值范围(取值范围)就比原来小了一半。

    但是在很多情况下,我们非常确定某个数字只能是正数,比如班级学生的人数、字符串的长度、内存地址等,这个时候符号位就是多余的了,就不如删掉符号位,把所有的位都用来存储数值,这样能表示的数值范围更大(大一倍)。

    C语言允许我们这样做,如果不希望设置符号位,可以在数据类型前面加上 unsigned 关键字。

    示例

    unsigned short a = 12;
    unsigned int b = 1002;
    unsigned long c = 9892320;
    

    这样,short、int、long 中就没有符号位了,所有的位都用来表示数值,正数的取值范围更大了。这也意味着,使用了 unsigned 后只能表示正数,不能再表示负数了。

    如果将一个数字分为符号和数值两部分,那么不加 unsigned 的数字称为有符号数,能表示正数和负数,加了 unsigned 的数字称为无符号数,只能表示正数。

    注意,如果是unsigned int类型,那么可以省略 int ,只写 unsigned,例如:

    unsigned n = 100;
    

    它等价于:

    unsigned int n = 100;
    

    无符号数的输出

    无符号数可以以八进制、十进制和十六进制的形式输出,它们对应的格式控制符分别为:
    在这里插入图片描述

    严格来说,格式控制符和整数的符号是紧密相关的,具体就是:

    	%d 以十进制形式输出有符号数;
    	
    	%u 以十进制形式输出无符号数;
    	
    	%o 以八进制形式输出无符号数;
    	
    	%x 以十六进制形式输出无符号数。
    

    那么,如何以八进制和十六进制形式输出有符号数呢?很遗憾,printf 并不支持,也没有对应的格式控制符。在实际开发中,也基本没有“输出负的八进制数或者十六进制数”这样的需求,我想可能正是因为这一点,printf 才没有提供对应的格式控制符。

    不同类型的整数,以不同进制的形式输出时对应的格式控制符(–表示没有对应的格式控制符)。

    在这里插入图片描述

    之前我们也使用 %o 和 %x 来输出有符号数了,为什么没有发生错误呢?这是因为:
    当以有符号数的形式输出时,printf 会读取数字所占用的内存,并把最高位作为符号位,把剩下的内存作为数值位;
    当以无符号数的形式输出时,printf 也会读取数字所占用的内存,并把所有的内存都作为数值位对待。

    对于一个有符号的正数,它的符号位是 0,当按照无符号数的形式读取时,符号位就变成了数值位,但是该位恰好是 0 而不是 1,所以对数值不会产生影响,这就好比在一个数字前面加 0,有多少个 0 都不会影响数字的值。

    如果对一个有符号的负数使用 %o 或者 %x 输出,那么结果就会大相径庭。

    可以说,“有符号正数的最高位是 0”这个巧合才使得 %o 和 %x 输出有符号数时不会出错。

    再次强调,不管是以 %o、%u、%x 输出有符号数,还是以 %d 输出无符号数,编译器都不会报错,只是对内存的解释不同了。%o、%d、%u、%x 这些格式控制符不会关心数字在定义时到底是有符号的还是无符号的:
    你让我输出无符号数,那我在读取内存时就不区分符号位和数值位了,我会把所有的内存都看做数值位;
    你让我输出有符号数,那我在读取内存时会把最高位作为符号位,把剩下的内存作为数值位。

    下面的代码进行了全面的演示:

    #include <stdio.h>
    int main()
    {
        short a = 0100;  //八进制
        int b = -0x1;  //十六进制
        long c = 720;  //十进制
       
        unsigned short m = 0xffff;  //十六进制
        unsigned int n = 0x80000000;  //十六进制
        unsigned long p = 100;  //十进制
       
        //以无符号的形式输出有符号数
        printf("a=%#ho, b=%#x, c=%ld\n", a, b, c);
        //以有符号数的形式输出无符号类型(只能以十进制形式输出)
        printf("m=%hd, n=%d, p=%ld\n", m, n, p);
    
        return 0;
    }
    

    运行结果:

    a=0100, b=0xffffffff, c=720
    m=-1, n=-2147483648, p=100
    

    对于初学者来说,b、m、n 的输出结果看起来非常奇怪,甚至不能理解。按照一般的推理,b、m、n 这三个整数在内存中的存储形式分别是:
    在这里插入图片描述
    当以 %x 输出 b 时,结果应该是 0x80000001;当以 %hd、%d 输出 m、n 时,结果应该分别是 -7fff、-0。但是实际的输出结果和我们推理的结果却大相径庭,这是为什么呢?
    注意,-7fff 是十六进制形式。%d 本来应该输出十进制,这里只是为了看起来方便,才改为十六进制。

    其实这跟整数在内存中的存储形式以及读取方式有关。b 是一个有符号的负数,它在内存中并不是像上图演示的那样存储,而是要经过一定的转换才能写入内存;m、n 的内存虽然没有错误,但是当以 %d 输出时,并不是原样输出,而是有一个逆向的转换过程(和存储时的转换过程恰好相反)。

    也就是说,整数在写入内存之前可能会发生转换,在读取时也可能会发生转换,而我们没有考虑这种转换,所以才会导致推理错误。

    如果感觉不错的话请点赞哟!!!

    展开全文
  • C语言输出整数二进制

    千次阅读 2019-01-24 14:55:46
    二进制算法都说的除2倒转,效率极低不说,还没考虑负数情况 , 用位运算法可以解决该问题: #include &lt;iostream&gt; using namespace std; void printBinary(int &amp;argc){ cin&gt;&gt;...
  • 2、C语言中规定,在符号位中,用0表示正数、用1表示负数。 3、C语言允许我们这样做,如果不希望设置符号位,可以在数据类型前面加上unsigned关键字, 例如:unsigned int b=1002;或 unsigned b=10...
  • C语言入门题库——输入10个整数,输出所有负数并求和 Descriptinon:从键盘输入10个整数,输出其中的所有负数,并输出所有负数的和 Input:输入10个整数 Output:输出多行,先输出所有...//输出负数并求和 #inclu...
  • 众所周知,在数字表达中,数字是可以加上正负号用于分区正负数的。在C语言中也是如此,但是鉴于数字在计算机中的存储...在C语言中,规定符号位用0表示正数,用1表示负数。 考虑符号位和不考虑符号位,之间相差了一个bi
  • 有如下一段C语言程序: #include "stdio.h" int main(void) { char a = 0xC8; printf ("字符a的ASCII码值的10进制是%d\n", a); return 0; } 程序定义了一个字符‘a’,并且赋予了初始值“0xC8”,这是一个16进制的...
  • C语言负数转正数的隐藏缺陷

    千次阅读 2013-07-24 15:30:16
    今天在写程序的时候发现了一个相当隐蔽的错误,查了好久才找到了这个缺陷,就是当我们在将一个负数变成正数的时候,一定要注意防止数据溢出。比如定义一个char型的变量a。。。。。。。。如下所示: char a; if (a...
  • 游戏的规则十分简单,参与游戏的N个整数将会做成一排,他们将通过不断交换自己的位置,最终达到所有相邻两数乘积的和最大的目的,参与游戏的数字有整数也有负数。度度熊为了在他的数字仆人面前展现他的权威,他规定...
  • 输入10个数,统计出并输出正数、负数和0的个数。 **算法分析:**用三个计数器:iCount1,iCount2,iCount3,分别统计大于0的个数,小于0的个数,等于0的个数。 #include &quot;stdio.h&quot; main( ) { ...
  • Description:编一程序,使得从键盘输入10个整数,可以输出其中的所有负数,并输出所有负数的和 Input 输入10个整数 Output 输出多行,先输出所有负数,最后输出所有负数和 Sample Input 11 2 3 -1 9 8 5 4 -2 -3 ...
  • C语言输入10个整数,统计其中正数、负数和零的个数,并在屏幕上输出(博主小白)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 560
精华内容 224
关键字:

c语言输出负数

c语言 订阅