c语言整型溢出
❶ 关于c语言整型数据的溢出问题~~求高手多指点~~
对于整数,反码,补码与原码相同。
对于负数,补码是原码的符号位不变,数值部分按位取反再加1。
知道负数补码,可以对改补备启码再一次求补码,就可以得到原码。
假设你是16位系统。
100000000000000
求补=1
11111111111111+1=00..00
b就溢出为0了。
不过现在都是32位系统了,int类型都是4个字节的都,a表示成00..00100000000000000了。
楼主的的这个程序不能造成溢出。
所以printf
("%d",b);打仿隐如印出来的携陆b应该是32768,也不是
-32768
❷ (c语言)整型数据的溢出
C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。
对于unsigned整型溢出,C的规范是有定义的烂缓——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned
char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
1.unsigned
char
x
=
0xff;
2.printf("%dn",
++x);
上面的代码会输出:0
(因为0xff
+
1是256,与2^8求模后就是0)
对于signed整型的溢出,C的规范定义是“undefined
behavior”,也就是说,编译器爱怎么实现就怎么实现。如:
1.signed
char
x
=0x7f;
//注:0xff就是-1了,因为最高位是1也就是负数了
2.printf("%dn",
++x);
上面的代码会输出:-128,因为0x7f
+
0×01得到0×80,也就是二进嫌历州制的1000
0000,符号位为1,负数,后面为全0,就是负的最小数,芹蔽即-128。
❸ 在C语言中,何为整型数的溢出位操作符和移位操作符又是什么
所谓的溢出是超出所能表示的范围了毁姿..比如说一个字节能表枣历示的最大个数是2^8 - 1,当然没有算符号位..我们就按这种状态下来举例
溢出::::::
a = 11111111; 那a这个数已经把8位全部用1表示满了,这时候b = 00000001够小了吧,这个时候如果算c = a+b; 限定c只能用一个字节表示,那加完之后就会出现溢出情况,a已经不能再加了,再加也不会比它能表示的最大的数大了..同样的道理,C语言整数用几个字节表示跟CPU是多少位的也有关系的,当然也跟编译的纤岩绝软件有关系,超过整数所能表示的范围就叫溢出...
位移:::::::
楼上的已经写出来了...
❹ 在C语言中,何为整型数的溢出位操作符和移位操作符又是什么
对于溢出上面的回答就行,补充一些,根据不同的机器(不同位宽)占的位宽也是不同的。不一定都是32。
另外关于溢出:
假如现在我的空间只有4位2进制(以下补码和符号不考虑,工作起来都一样)
也就是我只能表示0000到1111(也就是0-15)的数据
如果我现在已经存了1111这么样一个数据,可是系统又要给它+1那么他就会变成1111+1=>10000这时,最高位存不下会被丢弃.应该显示16的时候却变成了0,这时候我们就说他产生了溢出。32位也是一样就是32个1那么再+1就0了。
位操作符就是对该数据的二进制形式下的每一位分别进行操作使用的操作符就叫位操作符(组织语言能力差了点。。。。举个例子吧~~)
首先还是刚刚的数据1111B(也就是15,B是什么知道吧...)如果和1010B(也就是10)与运算(与或非知道吧。。。&& || !)那么结果应该是个Bool的值为true(非0即真,两个真就为真..)。
如果是用1111B和1010B进行位与运算(&)那么结果应该是1010而不是1.这就是位运算..
移位操作符
就是移位嘛..>>和<<.一个左移一个右移.你就当成一个是乘2一个是除2就好了,位移就*或/几次2.
❺ C语言中的int整型溢出是怎么回事
从C语言的内部处理机制来如闷说,int型数超出范围(溢出)被认为是一个正常现象,只会产生错误的计算结果或逻辑错误,而不会触发数据溢出的异常。因此,为了避免因为整数溢出而产生程序逻辑或计算错误,程序员必须自行检测可能渣渗弯出现的溢出或者确保不会出现数据溢出的情况。
C语言对于int类型数据超出范围的处理,只有一个最简单的原则:截断处理,即超出int位长度范围的高字节被自动截掉。
比如,假设int长度为16位的情况下,以下代码:
int
a=0X77FFFFL;
/*
由于超出范围,高位的77将被自动截掉,实喊衫际的a将会等于0xFFFF
*/
++a;
/*
a自增后,将超出范围,高位的1被截掉,实际a=0
*/
❻ c语言 整型数据溢出问题
int 型 占4字节(所占字节和编译器有关的,此处所说的是在VC上,比如在TC或BC上占2字节)
有符号 int 范围 -2^31~2^31-1
无符号 int 范围 0~2^32-1
如果超出这个范围就会溢出
❼ C语言关于整型数据溢出的问题
关于long型在计算机内存储方式,参看:
http://..com/question/112869407.html
yyrryyrr2的回答
-----------------------------------------------------
printf("%d\n%ld",a,b);中
printf将"%d\n%ld",a及b依次压入栈中
printf内部的可变参数分解函数从栈中取出数据替代%d,
依你的输出结果你用的是16位编译器。
栈从低地址到高地址数据为:
地址(假设) 数据
0xf000 0x3000(指含消差向("%d\n%ld")
0xf002 0x7fff(即32767)
0xf004 0x8000 (即32768)
0xf006 0x????(此处为main函数的局部变量)
那么printf首先接受一个16位的int型,取出0x7fff调用_itoa将其转化成数字字符并替换%d。
然后printf需要取出一个32位long型数据,从0xf004处,可是你只给入了一个16值,所以取出的32位值包含垃圾信息(有16位是main函数的局部变量或垃圾信息),是0x8000????形式,而实际上????处恰好包含了0x0000(这点从你第二个printf调用即可看出,后一堆垃圾数据是0x0000),所以最终输出数字0x80000000即-2147483648
对后两个printf的分析类似
第二个调用虽然传入两个可变参数,但是由于有3个%d,所以前两个取出后,继续从栈上取数据,取出了main的栈桢的数据0x0000
最后一个printf调用再取了更后面的数据。
--------------------------------------------------
楼主喜欢探究问题的根源。
你可以翻看我的网络回谈皮答关于c/c++的回答,桥凯会令你受益匪浅
❽ 在C语言中,何为整型数的溢出位操作符和移位操作符又是什么
整型溢出:
在整型数计算时,结果无法继续正确存储在整型变量中,即运算结果超出了整型数值所能表示的范围。比如计算100的阶乘等。溢出后的表现就是计算结果与期望值不符。
位操作符,是C语言中的一组操作符,包括
按位与&,按位或|,按位取反~,按位异或^,
左移<<,右移>>,以及在这六个操作符上扩展出的赋值符号,包括&=,|=,~=,^=,<<=,>>=等。
其中:
1
&为按位与操作,a&b结果的每位上,只有当a,b对应位上均为1时,才为1,否则结果位上为0。
2
|为按位或操作,只有a,b对应位上均为0,结果对应位上才为0;否则结果的该位上值为1。
3
~取反,为单目操作,只有一个操作数,当操作数的某位上值为1时,结果值为0;否则结果值为1。局喊
4
^异或操作,a,b对应位上相同时,结果位上值为0;否则值为1。
5
<<左移操作,a<<b的结果为,将a的各个位向左移动b位,左侧b位抛弃,右侧补b个0。
6
>>右移操作,a>>b的结果为,将a的各个位向右移动b位,右侧b位抛弃,左侧补b个兄腊森0或1。当a为无符号数,羡亩或正数时,左侧补0;当a为有符号负数时,左侧补1。
❾ (c语言)整型数据的溢出
其实这个问题很简单的,这个可能和你编译器环境有关,int 类型表示范围是-32768-32767。所以你可以把它的表示范围比作一个圆。因为在电脑中负数是按补码保存的,所以加1之后会出现进位。如果是char 类型表示-128-127的话,那么char a = 128也会变成-128的。
你可以看一下下面的图,这个圆就好比表示的范围。如果不信的话你可以将int a = 32769;试试的,输出应该会变成-32787
❿ C语言整型溢出会怎样
C语言的整型液腊腔溢出,闹衫分为无符号整型溢出和有符号整局缺型溢出。
对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned
char(1字符,8bits)溢出了,会把溢出的值与256求模。