有一道关于C语言的题,希望大家可以帮助我理解一下 我写了一道C语言编程题,但是出现了我不能理解的BUG希望有大...

作者&投稿:度庞 (若有异议请与网页底部的电邮联系)
因为定义a为无符号型整数,其65535的二进制表示为1111111111111111,即16个一。而在函数printf中使用%d,即表示以整数的类型输出,整数类型默认是有符号的,所以将16个位分为一个符号位,和十五个数据位。又因为编码系统默认符号位为1表示负数,而在计算机编码中,负数使用补码表示,所以1111111111111111被认为是某一负数的补码,又根据补码的计算方法计算源码(负数符号位不变,数据位取反加1)为1000000000000001,为—1,所以得出如此结果。如果使用%u,则表示以无符号整数类型输出,则会输出65535.

朋友你好,这个题是这样的,因为unsigned int a的取值范围为1,2,3······65535,若你程序是那样的,则运行的结果为65535,而不是-1,若你的程序为:
unsigned int a=65536;
printf("a=%d\n",a);
则结果为:a=1
若你的程序为
unsigned int a=65537;
printf("a=%d\n",a);
则结果为:a=2
不知你体会到没有,也就是一个圈的意思,若数大于范围,则它就从最后的那个数向后再推。这个重在意会。希望能帮到你。

在输出的时候unsigned int的65535被转化为int型,printf("a=%u\n",a);就不会发生这种转换。

65535 = 0xFFFF = 11111111 11111111 11111111 11111111 (B)
而-1也是11111111 11111111 11111111 11111111 (B)
所以就输出-1了。
这关于补码问题。

补码的事情,你打印用的不是无符号打印,建议用一楼的。

一道我不能理解的c语言题,希望大家帮我解答,谢谢~

C 1
首先说函数void fun(int*pl,int*p2,int*s)

我们知道,函数传参数有两种方式,传值和传址。可能理解上比较难,我们说的简单点,
以一个交换函数为例int swap(int a, int b),不论a, b什么值,在调用以后,都没法交换,如果想达到交换a,b的目的,就要使用int swap(int * a, int * b),或者int swap(int &a, int &b)(如果想详细了解,随便搜搜传值传址就OK。)。
那么,想要改变一个指针的值呢(指针的值其实就是它指向的地址)?有了上面的参考,是不是需要用一个指向指针的指针呢?叫做2级指针。

要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数。
是要每一行的统计数据吗?

一道C语言简单程序题
答:4 .* ->* 左 5 * / % 左 6 + - 左 7 << >> 左 8 < <= > >= 左 9 == != 左 10 & 左 11 ^ 左 12 | 左 13 && 左 14 || 左 15 ?: 右 16 = *= /= %= += -= <<= >>= &= |= ^= 右 17 throw 左 18 , 左 c=(a-=a-5),(a=b,b+...

一道大学计算机C语言编程题,急求高手解答,谢谢!
答:include<stdio.h>int main(){int a[1000],i,j,n; scanf("%d",&n);for(i=0;i<=n;i++) a[i]=i;for(i=2;i<=n/2;i++){for(j=i+i;j<=n;j+=i)a[j]=0;}for(i=2;i<=n;i++)if(a[i])printf("%d\n",i);return 0;} ...

一道大一计算机C语言编程题,急求答案,在线等,非常感谢!
答:include<stdio.h>#include<stdlib.h>void swap(int *num1, int *num2){int temp;if (*num1 > *num2){temp = *num1;*num1 = *num2;*num2 = temp;}}int GCD(int num1, int num2){ // 最大公约数if (num1 == 1) return 1;for (int i = num1; i >= 1; i--){if...

C语言的一道题,急求解。
答:我做了一个,你可以参考一下我的,或许你也能改动些变成你的 我在程序如下:include "stdio.h"include <string.h> int main(){ int k=0,i, j;char a[100];int flag = 1;//用来设置输入回车符号的标志 for(k=0;flag!= 0;k++)//flag为0时停止循环 { scanf("%c",&a[k]);if (...

有关C语言的几道题,求答案及解释
答:1、题目倒数第二句改为“输入字符A后”的话,ch的值是'A',getchar()是从标准输入流读取一个字符,并返回这个字符,赋值给了ch,所以ch的值就是你输入的那个字符,你输入A,它的值就是A 2、暂时还不是很明白,C和D都能在win-tc下编译通过,值都存在变量str3,和str4里面,可以通过printf("...

问一道关于C语言的试题,在此先谢谢大家,试题在下面,如果正确的话我保证...
答:char b[30],*chp;定义char数组30和指针*chp,这个定义了没有用过不用管 strcpy(&b[0],"GH");//将GH拷贝到b【0】,但是b[0],只有一个字符的位子,所以b[0]=G,b[1]=h,以下类似 strcpy(&b[1],"DEF");b[1]=d,b[2]=E,b[3]=F strcpy(&b[2],"ABC");b[2=A...]printf(...

一道关于c语言的题,准确的说是算法思想,表示想不明白,希望有大神...
答:第一次 第二个给第一个一个气球(下面称第二个给第一个)第三个给第二个 第四个给第三个 结果为 2, 2, 5, 3 第二次 第二个给第一个 第三个给第二个 结果为 3, 2, 4, 3 第三次 第三个给第二个 结果为3, 3, 3, 3

一道大一计算机C语言编程题,在线等高手解答,谢谢,在线等,感激不尽!
答://思路,从两个数中比较大的一个开始循环一直到两个数的乘积,都能整除就是最小公倍数了#include <stdio.h>#include <stdlib.h>int main(){ int i,j; int loop; scanf("%d %d", &i, &j); loop = (i > j) ? i : j; for(;loop <= i *j; loop++) { ...

菜鸟问一道简单的C语言编程题
答:完整程序如下,我加的就是定义了一个函数AREA include <stdio.h> include <math.h> //函数的定义,定义area=sqrt((s*(s-a)*(s-b)*(s-c))根号下的内容,返回一个值,在主函数里调用该函数 float AREA(float s,float a,float b,float c){ float X=s*(s-a)*(s-b)*(s-c);return ...

问一道简单的C语言题
答:int型的三个数:include <string.h>#include <stdio.h>#include <stdlib.h>int main(void){ int a,b,c; int i; printf("请输入三个数值(a,b,c):"); scanf("%i,%i,%i", &a,&b,&c); if (abs(a)>abs(b)) { i=a;a=b;b=i;}if(abs(b)>abs(c))...