[英]short int Integer wrap around / short int inversion in c not understood, difference between assignment and prints
以下代码片段
short int k = -32768;
printf("%d \n", -k);
k=-k;
printf("%d \n", k);
版画
32768
-32768
我假设两个打印都是一样的。 有人可以解释一下区别是什么,为什么赋值k=-k
会导致回绕吗? 很难在网上找到解释,因为我真的不知道该怎么做。
好吧,要打印 short
,您需要使用长度修饰符。
将格式字符串更改为%hd
。
因为SHRT_MIN = -32768
和SHRT_MAX = +32767
。 看看2的补码如何工作。
实际上,根据C语言的国际标准(即委员会草稿— 2005年5月6日 ,第50-51页),有关带符号整数:
对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位。
不需要任何填充位; 必须有一个符号位。
作为值位的每一位应具有与对应的无符号类型的对象表示形式中的相同位相同的值(如果有符号类型中有M个值比特,无符号类型中有N个值比特,则M <= N)。
如果符号位为零,则它将不影响结果值。
如果符号位为1,则应通过以下方式之一修改值:
取反符号位0的对应值(符号和大小);
符号位的值为−(2 N )(二进制补码);
符号位的值为-(2 N -1)(补码)。
其中哪一个是实现定义的 ,标志位为1且所有值位为零的值(对于前两个)还是标志位且所有值位为1(位的补码)是陷阱表示?或正常值。 在符号,大小和“ 1”的补码情况下,如果此表示形式是正常值,则称为负零。
因此,换句话说,在您的情况下,似乎正在使用2的补码,但是不应假定在所有平台和编译器中都使用。
-32768
是十六进制8000
。 32768
不能表示为带符号的16位数字,因此编译器将-k
提升为十六进制值00008000
的int
。 当此数字分配给16位变量时,高位将被截断,从而再次导致8000
或-32768
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.