c语言的-1输出的%u为什么是4294967295
k是int型常量,int=signed long (有符号长整型),就是有正负之分。
int的范围是 -(2^31)-1 ~ (2^31)-1
%u是unsigned,无符号,就是没有正负之分,只有正数,负数也当作正数处理。
这里的范围是一个环状的,-1的无符号型并不是1,而是2^32-1,其原因:
首先,unsigend int范围是0~(2^32)-1
有符号时:——————————————
…… -1 0 ……
无符号时:——————————————
0 1 2 ………… | |
4294967294 4294967295(==-1)
也就是说,-1原先在0的左边,在整形负数中最靠近0,但是一旦负号不存在,-1就被丢到了后面,-1的unsigned值自然是unsigned int的最大值4294967295。
再有,-3的unsigned型是:4294967293.
这里的范围是环形的概念还要你自己揣摩、分析。如若还是看不懂,我建议你问你的老师或是同学,不要抹不开面,搞学术的,就要有喜欢问的习惯。遇到不懂的一定要问明白,不可忽视。
输出结果为:-1,429496729565536,65536分析如下:%d—整型格式化输出符,有符号的。%u—整型格式化输出符,无符号的。我想其他3个的输出结果应该是很清楚的,主要是第2个为什么是4294967295呢?无符号的int的数值范围是0~4294967295,而整型数值在内存中是以其补码的形式存放的,正数的补码是其本身,而负数的补码则不是,我以一个一个字节的内存大小来说明:-1原码:1,000 0001,最高位表示符号位,0为正,1为负。其补码的转换方法是:符号位不变,数值位取反再加1,因此,-1的补码为:1,111 1111。对于int为32位4字节的,转换方法一样。那么,int i=-1,在内存中存放的补码值为:1,111 1111 ... 1111 1111。当以%u格式符形式输出时,最高位的1的性质就变了,编译系统就会把最高位的1也当成了数值位了,而不是符号位了,那么输出的值就是4294967295了。
C语言中printf("%u")表示按无符号数形式输出一个整数。
现在的机器一般为32位或64位机,整数存储占4个字节,一个字节8位,共计32位。
整数在计算机中以补码形式存储,-1的补码为32个1组成的二进制数,按无符号数输出这个二进制数,就是2^32-1=4294967295
由于采用补码表示整数,计算机本身不关心整数是正数还是负数,统一按无符号数对待。具体输出时,显示为什么数,计算机按编程者的格式要求进行处理输出。如32个1组成的二进制数,按%d输出就是-1,按无符号输出就是4294967295。
在计算机中,可以区分正负的类型,称为有符号类型(signed),无正负区分的类型,称为无符号类型(unsigned)。有符号类型数据的最高位表示符号,1表示正,0表示负。
【 signed 】 int signed关键字常省略不写
取值范围:-2147483648~2147483647
unsigned int
取值范围:0~4294967295
【 signed 】 char
取值范围:-128~127
unsigned char
取值范围:0~255
%u是输出无符号十进制整数。整数占4个字节,-1的十六进制为0xFFFFFFFF,如果把它看成无符号整数,就是十进制的4294967295。
4个字节是32位,可表示的最大数是4294967296,
负数是以补码形式存储的
-1存储为32个1
输出为无符号整数,就是1*(2^31)+1*(2^30)……+1=4294967295
关于原码、反码、补码,建议复习下!网上到处是资料,自己看看,加深印象
c语言中怎样输出变量的原符号
1整型量 整型量包括整型常量、整型变量。整型常量就是整常数。在C语言中,使用的整常数有八进制、十六进制和十进制三种。1.1整型常量 1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。以下各数是合法的八进制数:015(十进制为13) ...
C语言free()释放动态内存时报错,研究好长时间也没搞懂,请大神帮忙看 ...
你的错误在于第42行:(pday + day) = buf;你的意图是将buf的double数组复制给 pday+day 的内存指向空间,要达到这个意图必须使用memcpy这样的内存拷贝函数,不能直接把指针赋值给它。否则将来对 *(pday+day)做free的时候,实际上是对buf这个栈内存空间做free,这样一来程序立刻垮台。因为栈内存是...
C语言中的键盘输入函数。。。
k=k&0xff?0x00ff:k>>8;其实就是 if(k&0xff) { k=0x00ff;}else { k=k>>8;}的简写。其实0xff和0x00ff是一样的,都表示同一个十六进制的值。书上这么写,没有错;至于为什么,就不好说了。可能是让你多学点知识,也可能是现在很多书其实在编写时并不是很认真的。毕竟尽信书不如无...
求C语言编程题
ulResult += 1 ; } default: { ulResult += 1 ; } } printf( "ulResult = %u", ulResult ) ; return ulResult ;}当输入为ACTION_B时,输出结果为: ulResult = ___;答案:2(因为此分支没有break分支)14.下面的代码中,函数Test执行完毕后,打印的结果是 ___。unsigned long g_ulGlobal = 0;void...
Microsoft VBScript 编译器错误 错误 '800a03f6' 怎么弄好?_百度知 ...
如果VBScript 语句结构违反了一个或多个 VBScript 脚本语言语法规则,就会产生 VBScript 语法错误。 错误通常在执行程序前,编译程序时产生。 以下是53个语法错误: 错误编号 描述 十进制 十六进制 说明 1001 800A03E9 内存不足 1002 800A03EA 语法错误
如何使用js封装一个使用ASCII码加密参数的方法
2.进行url跳转时可以整体使用encodeURI 例如:Location.href=encodeURI("http:\/\/cang.baidu.com\/do\/s?word=百度&ct=21");3. js使用数据时可以使用escape 例如:搜藏中history纪录。4.escape对0-255以外的unicode值进行编码时输出%u***格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同...
谁有四川省计算机C语言二级考试的真题或者模拟题?多给我几套最好了...
D)k+1 (19)有以下程序,其中%u表示按无符号整数输出(B) main() {unsigned int x=0xFFFF; \/* x的初值为十六进制数 *\/ printf(“%u\\n”,x); } 程序运行后的输出结果是 A)-1 B)65535 C)32767 D)0xFFFF (20)设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C) A...
c语言,怎样读取一个BMP图片?
printf("\\n bmp reserved1: %u",bmp.bfReserved1); printf("\\n bmp reserved2: %u",bmp.bfReserved2); printf("\\n bmp offBits: %u",bmp.bfOffBits); printf("\\n bmp bisize: %u",bmp.biSize); printf("\\n bmp biWidth: %d",bmp.biWidth); printf("\\n bmp biHeight: %d",bmp.biHeight); pr...
求计算机二级考试真题
2011年计算机二级考试C语言十套上机题 1.填空题 请补充函数fun(),该函数的功能是:把从主函数中输入的字符串str2接在字符串str1的后面。 例如:str1=“How do”,str2=“ you do?”,结果输出:How do you do? 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入...
移动4g广告移动3g手机广告
1.经典手机广告语 2.放暑了,正好看到了很多宣传3G手机的广告,问下移动的3G业务要怎么办理呢? 3.手机为什么那么多广告,怎么处理 4.移动手机经典广告词 喜迎龙年牵手3G手机,心动不如行动! 3G手机,喜迎龙年沟通你我! 用3G手机龙年更完美无缺! 3G手机龙年品质更完美! 龙年3G手机魅力一族! 古有鸿雁传书,龙年有3G...