在C语言中,unsigned int a=65535 ; …………;printf("a=%d",a); 为什么输出结果a=-1

作者&投稿:国黛 (若有异议请与网页底部的电邮联系)
有一例题如下: main() { unsigned int a=65535; printf("a=%d,%o,%x,%X,%u\n",a,a,a,a,a); } 求运行结果。~

这里说是不对的。
要看什么机器什么的编译器才能得出结果。
的确a=65535 十六进制是0xFFFF
但如果unsigned int 类型是4字节的,你打印出来的依然是
a=65535
如果unsigned int 类型是2字节的,这时就是-1了
因为计算机采取的是补码来保存数据的
a=65535 二进制就是1111 1111 1111 1111,这是补码,第一位是符号位,等于1时就表示是负数。
111 1111 1111 1111 减1再取反就是000 0000 0000 0001 这就是十进制的1了
再加上负号就是-1了

VC的输出是正常的。

这样输出才是-1
short a = 65535;
printf("%d", a);

因为在VC6中,int占4个字节(32位),short占2个字节(16位)。

a的类型是不带不符号,也就是说有一个变量为a的box中装入了一个数据,而printf中的%d又将a作为带符号数显示,在其他未明确指出时,a显示是一个不带符号数,而你使用了%d要求将a作为带符号数显示,那么显然显示的结果是-1,也就是说,如果a=95,printf("a=%c",a);则会显示成字符a呢!

65535二进制应该是全1或者说全F,-1在有符号数中表示就是全F
-1 的二进制表示最高位为1(符号位,为1表示负),最低位为1
内存表示是补码,即原码取反加1,取反符号位不变,就变成了最高位为1最低位为0中间全为1,再加上1,就全为1了

我说明白了吧

unsign int 的65535和,int型的-1,在内存中的,存储格式是一样的。你用%u,输出就是65535了。似乎,是用补码存储的。你可查相关资料,还没懂欢迎追问。

在16位的C编译器中,unsigned int a=65535;存储形式为16位全1。
而当它以16位有符号整数格式解读时,因为其最高位为1,于是按16位补码被解读为一个负数-1。


C语言源代码中,行结尾有反斜杠,这些反斜杠有什么用?
define uint unsi\\ gned int 上面将uint 代替unsigned int 如果写成 define uint unsi gned int 就编译出错了。。。\\就是表示 紧紧接入下一行 表示不间断

C语言中有无符号类型的输出问题
因为short和int型占的字节数不一样,一般来说,int占四个字节,short占两个字节(不同的系统分配的字节数不一样)。他们是以二进制数存放在内存中的。你把-1赋给short型的a,输出的时候,只取了后面的两个字节的内容,那个负号在前两个字节中。你把-1赋给int型的a时,输出的时候,取了四个字...

C语言源代码中,行结尾有反斜杠,这些反斜杠有什么用?
反斜杠起到换行作用,用于宏定义和字符串换行。其中宏定义中使用居多。如果一行代码有很多元素,导致太长影响阅读,可以通过在结尾加\\的方式,实现换行,编译时会忽略\\及其后的换行符,当做一行处理。在宏定义中,要换行必须使用\\结尾。在字符串常量中,可以使用\\结尾,如 "this \\ is \\ for\\ testing"...

C语言类型转换运算问题
虽然你声明了unsigned char a,b,c,d,e;但实际上,在进行+-*\/四则运算时,他实际上是当成整型变量int来处理的 先看a=0 这个没什么问题 b=251,如果是int类型的话:0000 0000 1111 1011(一共32位,我只写这几位)但由于b是unsigened char类型,所以b各二进制位是1111 1011 好了,关键的地方...

C语言 问题
{ unsigned int a = 65535;int b = -2;printf("a = %d, b = %u\/n",a,b);getchar();} 输出:a = -1,b = 65534 分析如下:1.printf函数中a=%d,采用的是有符号输出,而a=65535为有符号的时候其值为-1,所以输出为-1;如果你想输出65535,应该这样写a = %u 2.printf函数中b=...

C语言函数的接口子程序
unsigned off)根据段seg和偏移量off构造一个far指针unsigned getpsp()取程序段前缀的段地址,并返回这个地址char *parsfnm(char *cmdline,struct fcb *fcbptr,int option)函数分析一个字符串,通常,对一个文件名来说,是由cmdline所指的一个命令行.文件名是放入一个FCB中作为一个驱动器,文件名和扩展名...

洮北区18190627701: C语言中“unsigned int”占几个字节 -
拔兔奥沙: 不同的编译器结果是不同的 一般是2个或者4个字节你可以用sizeof(unsigned int)查看

洮北区18190627701: C语言中的unsigned int是什么 -
拔兔奥沙: unsigned integer意思是“无符整型”,表示从0开始到2^32-1的所有整数.unsigned 后的int可以省略的. 具体用法如下: unsigned a; a=5; 或:unsigned int a; a=5; 16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned int能存...

洮北区18190627701: C语言中,unsigned int型数据的取值范围是??? -
拔兔奥沙: 0到65535. 举例: unsigned a; a=5; 或:unsigned int a; a=5; 16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned int能存储的数据范围则是0~65535,在计算机中,整数是以补码形式存放的. 系统使用无符号数只表示大...

洮北区18190627701: c语言unsigned -
拔兔奥沙: 比较简单的区别就是,如果你使用的是char类型时,不需要unsigned;如果你是用的int 类型,并且一定不会用到负数,这时用unsigned做修饰可以防止出错.

洮北区18190627701: c语言中signed 和unsigned是什么意思 -
拔兔奥沙: 1、signed是默认的,表示这个变量是有符号的,可以存储整数和负数. 2、unsigned则需要显示给出表示这个变量,没有符号值能存储数的大小,而且不能表示正负. 3、signed存储符号是有代价的,代价就是存储空间中的一个比特位专门用...

洮北区18190627701: C语言中“unsigned int”占几个字节?跟编译环境和XP 32 位还是64位有关系吗?谢谢 -
拔兔奥沙: 都占4个字节,跟32位系统或者64位系统无关.long int取决于系统,long int32位计算机4字节,64位计算机8字节.

洮北区18190627701: C语言中的定义整型变量时前面的unsigned是什么意思啊 -
拔兔奥沙: 无符号,比如:int a,那么取值范围可以为负;如果是unsigned int a,那么就是只可能为0以上的整数,包括0.

洮北区18190627701: 请问C语言中的unsigned类型只得是什么类型? 例:unsigned a; 仅仅是unsigned类型!不是unsigned int a;! -
拔兔奥沙: ungsiged 关键字是把变量声明为无符号类型的,它与变量的基本类型(如int ,long,double等)配合使用,当它所修饰的基本类型为int时,int可以省略,所以,像楼主所理解的ungsiged a; 和 unsigned int a; 是等价的,这个理解是没错儿的! 另外,如果你声明了一个 int a;则编译器默认它为有符号类型,即它等同于 signed int a;

洮北区18190627701: 在C语言中,unsigned int a=65535 ; …………;printf("a=%d",a); 为什么输出结果a= - 1 -
拔兔奥沙: a的类型是不带不符号,也就是说有一个变量为a的box中装入了一个数据,而printf中的%d又将a作为带符号数显示,在其他未明确指出时,a显示是一个不带符号数,而你使用了%d要求将a作为带符号数显示,那么显然显示的结果是-1,也就是说,如果a=95,printf("a=%c",a);则会显示成字符a呢!

洮北区18190627701: C语言中:unsigned int a= - 2;printf("%u",a);输出结果为多少? -
拔兔奥沙: 在16位int平台下,输出是65534;在32位int平台下,输出是4294967294.以32位int平台为例,题中的unsigned int a=-2;语句在unsigned的修饰下,赋给变量a的是-2补码的无符号值,即4294967294.但后面的printf("%u",a);的输出并不与...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网