Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将int转换为char C公式_C_Char_Int_Modulo - Fatal编程技术网

将int转换为char C公式

将int转换为char C公式,c,char,int,modulo,C,Char,Int,Modulo,这是怎么回事? 是不是p=num%(127+128)-1 或者p=num%256或者其他什么? 我需要知道为什么p等于1。 谢谢 由于65537是二进制的00000000000001 00000000000001,但字符类型只有1个字节,最后一个字节被认为是字符值,即00000001=1简短回答:在标准处理器上,实际上是1,因为65537%256==1。原因是ksmonkey123解释的 注意:如果您正在编写127+128,因为有符号字符的边界(相当于当今典型编译器上的char)是-128到+1

这是怎么回事? 是不是
p=num%(127+128)-1
或者
p=num%256
或者其他什么? 我需要知道为什么p等于1。
谢谢

由于65537是二进制的
00000000000001 00000000000001
,但字符类型只有1个字节,最后一个字节被认为是字符值,即
00000001=1
简短回答:在标准处理器上,实际上是1,因为65537%256==1。原因是ksmonkey123解释的

注意:如果您正在编写
127+128
,因为
有符号字符
的边界(相当于当今典型编译器上的
char
)是-128到+127,请记住-128到+127之间的值的数量是(127-(-128)+1),这也会产生256,因此,使用
有符号字符的界限(-128到127)或
无符号字符的界限(0到255)并不重要

挑剔:实际上,分配一个不能在有符号的目标变量中表示的值,会得到未定义的行为,根据C标准,所有下注都是无效的


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

我的问题更多:为什么编译器不给您错误<代码>i
未初始化!乍一看,
p
num
完全无关,而是一个未显示的值
i
。打字错误?在这种情况下很可能是
num%256
。这个答案基本上是正确的(只需删除“不确定”并修复3个lefttmost字节值)。注意,这是实现定义的,(即C标准不强制此行为),谢谢:)那么%256方法正确吗?为什么它没有定义?并不是说我把字符p=10000;,我将(char)放在大数字之前,这样它会首先将其转换为char,然后将其放入char变量中。编译器非常清楚目标是一个char变量,因此必须将该值转换为char。强制转换只是使隐式转换成为显式转换,而不改变行为。许多编译器在隐式缩小转换时发出警告(因为您可能会无意中丢失精度),而在显式转换时保持沉默(因为您显式请求丢失精度)。第二:关于未定义的事实,我在C11最终草案方面实际上是错的。C11最终草案第6.3.1.3节规定,在这种情况下,行为是一个实现定义的值(“算法”必须记录并保持一致)或导致一个实现定义的信号。这与C99()相同,所以它是已定义的还是未定义的?无论您是否使用强制转换,sIt都是“实现定义的”。因此,标准compliants C编译器的作者必须记录在这种情况下发生的事情,并且必须始终如一地遵循该文档。例如,对于gcc,请看这里:。它们明确指出,有符号变量中的值与要存储的原始值之间的差值是2^N的倍数,其中N是目标变量中的位数。这就是他们所说的“约化模2^N”的意思。
int num = 65537;
char p = (char)num; //char = 1;