2014-11-22 169 views
3
int num = 65537; 
char p = (char)num; //char = 1; 

这是怎么回事? 是p=num%(127+128)-1p=num%256还是别的? 我需要知道为什么p等于1. 谢谢!将int转换为char C公式

+1

我的问题是:为什么你的编译器给你没有错误? '我'没有初始化! – Rizier123 2014-11-22 11:56:06

+0

乍一看,'p'与'num'没有任何关系,而是没有显示的值'i'。错字? – 2014-11-22 11:56:43

+0

在这种情况下很有可能是'num%256'。 – 2014-11-22 11:59:13

回答

3

简短的回答:在标准处理器的做法,这是1,因为65537%256 == 1.原因是一个ksmonkey123解释。

注意:如果你正在写127 + 128因为signed char,这相当于char上时下典型的编译器的界限,是-128到+127,请记住,值的-128和+127之间的数是( 127 - ( - 128)+ 1),其中产生256,因此使用signed char(-128到127)或unsigned char(0到255)的范围无关紧要。 Nitpick:实际上,如果分配的值不能在签名的目标变量中表示,就会得到未定义的行为,并且根据C标准,所有投注都将关闭。

指定正数不适合无符号变量的值将产生“mod范围”行为,如果char有8位,则为无符号字符的“%256”。将一个负数值赋值为一个无符号变量将导致标准定义的三种可能行为之一。该实现必须描述该实现使用的行为。现在,所有非嵌入式C编译器的行为就像将2^N的倍数(其中N是目标类型的位数)相加。所以“-510”通过加2 * 256得到+2,然后这个+2被存储在变量中。

+0

谢谢:)所以%256方法是否正确? 为什么它不确定?它不是我把char p = 10000 ;,我把(char)放在大数字之前,所以它会先把它转换成char,然后把它放到char变量中。 – Xiobiq 2014-11-22 13:01:59

+1

第一次:转换对生成的代码没有影响。编译器非常清楚目标是char变量,因此它必须将该值转换为char。该转换只会使* implicit *转换和显式转换,而不会改变行为。许多编译器会在隐式缩小转换时发出警告(因为您可能会失去精度),同时他们对显式转换保持沉默(如您明确要求的那样失去精度)。第二:对于未定义的事实,我在C11最终草案方面其实是错误的。 – 2014-11-22 13:10:15

+1

C11最终草案的第6.3.1.3节http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf指出,在这种情况下,行为是实现定义的值(“算法“必须被记录并且一致)或者导致实现定义的信号。这与C99(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) – 2014-11-22 13:13:12

6

,因为65537是二进制00000000 00000001 00000000 00000001,但char类型只有1个字节,最后一个字节被认为是char值,至极为00000001 = 1

+0

65537 = 2 ** 16 + 1 ... – peterh 2014-11-22 12:09:22

+0

这个答案基本上是正确的(只是删除“不确定”,并修复3个最左边的字节值)。 – 2014-11-22 12:10:26

+0

谢谢。我想我在转换工具中创建了一个类型... – ksmonkey123 2014-11-22 12:40:44