c语言的一些问题,关于长整形数据赋值到短整形字符。出现数据溢出的问题

如题所述

你的理解是正确的,书上的这个部分是错误的(你看书还是挺细心的!)。(011...111)+1之后是10...000。-32768的补码就是10...000。而11...111是-1的补码。短整型各个负数的补码依次是:
10...000: -32768
10...001: -32767
10...010: -32766
......
11...100: -4
11...101: -3
11...110: -2
11...111: -1追问

方法1:
-32767 的原码是1111...1111
补码
取反1000....0000
加一1000....0001
所以推出
-32768 的补码是
1000....0000

方法2:
-32768 的原码是[1]0000....0000
反码是0111....1111
加一就是1000....0000[补码]

然后就是说书上错在3.16-B 图
应该是[10...00 ]

追答

在16位中,原码与反码是不能表示-32768的,你后面的“比如........”是错误的推导。应该是这样的:
(-32768) = (-32767) - 1,......... A
32767的原码是011...111,
得 -32767的原码为111...111,
得 -32767的反码为100...000,
得 -32767的补码为100...001,
再根据A,得 -32768的补码为100...000

另一个方法就是,因为-1的补码为111...111,然后连续进行32767次递减1(即-1-32767)运算,即可得100...000,而-1-32767不就是-32768吗?

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-24
看后面的话,补码。追问

我也看到是补码了,
+1 之后是1000 0000 0000 0000
这个形式是负数的补码形式(在计算机中负数以补码形式存放.),

转换为源码是
-1 再取反
减一之后 :0111 1111 1111 1111
再取反: 0000 0000 0000 0000
这个数值就是负数的原码? 原码不是应该第一位是1 吗?这个原码也不是-32768啊

c语言中,关于字节较大的数据赋值给占字节较小的数据时,数据的溢出情况...
有符号的char类型,11111111就是-1。没问题啊

C语言中,给定字符数组数据溢出运行报乱码,scanf输入字符数组数据溢出正 ...
首先,这个不叫溢出,这个是数组越界 其次两个代码都是数组越界的,只不过第一个由于后续的定义的数组做了初始化,大片的内存被赋值为'\\0',所以输出后没有看出来而已

c语言数据溢出怎么办
1、溢出:数据类型超过了计算机字长的界限而出现的数据溢出;2、溢出可能原因:当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时 (假设定义数组int Array[10], 而在调用时使用Array[11] 或存放的数据超过int类型容量等), 内存缓冲区就可能会溢出.3、溢出因素...

c语言溢出问题
short型数据是16位表示最高位是符号位,所以只有15位表示数值,15位000000000000000-111111111111111表示的范围是0-32767,又加上最高位的符号位(第16位),就可以表示-32768-32767 。unsigned short型数据是16位都用来表示数值,16位0000000000000000-1111111111111111表示的范围是0-65535。计算机在进行计算...

c语言无符号长整形赋值问题,在线等,求解答!!!
在TC下,一个整数默认情况下是两个字节的内存单元存放(VC一个整数默认情况下是四个字节)数的表示范围为:-32768 ~ 32767 3600*24=86400=0x15180 已超出范围,实际赋给变量的值不是0x15180,而是0x5180=20864 所以赋值的要写成:t = 3600 * 24L;(L表示长整形数)...

c语言整型常量问题
其实只有三种:整型;字符型;浮点数型 1、整型:就是我们平时说的整数,但是在计算机里面,它给这个整数划定了一个范围。比如int型的范围就是- 32768 ~ 32767,意思是给它定义的时候,只能这个范围内定义,超出了就要出错。所以呀,就有人想呀,如果我要定义更大的数怎么办??好了,接下来就有了...

c语言中,将整数值赋值给字符数组的问题
void main(){ int a=10;char t[3];t[0]=a\/10+48;t[1]=a%10+48;t[2]='\\0';printf("输出t【3】的值:");printf("%s\\n",t);} 我指一下你的错误:1 对字符数组定义的时候出错,出现了反复定义 2 对数字 比如数字A 要把它转换成字符A 必须加上48,将其类型转换 3 要...

在C语言中如何使输入的数值赋值到未知数上
首先从你的表述上看感觉你基础很薄弱,问题是,c语言中数据在输入的时候都要先定义一个变量用来存储用户输入的数据 比如,我要输入一个数字,那么我就要定义一个变量比如这样:int a;然后,我才能调用输入函数scanf(“%d”,&a);来从键盘输入数字,而输入的数字就存放在a里面了。所以,如果需要将...

c语言数据溢出是如何处理
用圆来形容int吧·他从0开始旋转~当超过最大值的时候系统就溢出了,就会转到负数的那一边~大概就是这个意思~我记不清他具体值了~

C语言 整形变量赋值到字符串
include<stdio.h>int main(){ char a[100],*s1="hello",*s2=",",*s3="world"; int i=123; sprintf(a,"%s%s%s%d",s1,s2,s3,i); puts(a); return 0;}前提是a空间必须足够大

相似回答