Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
在C语言中打印字符变量的整数值_C_Character - Fatal编程技术网

在C语言中打印字符变量的整数值

在C语言中打印字符变量的整数值,c,character,C,Character,最近在我的研究所,我得到了一个密码,并被要求找出答案。代码如下所示 #include <stdio.h> int main() { char ch=500; printf("%d\n",ch); } #包括 int main() { char ch=500; printf(“%d\n”,ch); } 输出为-12 我的问题是:如何计算此类代码的值?有没有找到值的公式或过程?使用字符数据类型对整数进行编码时,字符值从-128到127。值溢出了 500 - 127 =

最近在我的研究所,我得到了一个密码,并被要求找出答案。代码如下所示

#include <stdio.h>
int main()
{
    char ch=500;
    printf("%d\n",ch);
}
#包括
int main()
{
char ch=500;
printf(“%d\n”,ch);
}
输出为
-12


我的问题是:如何计算此类代码的值?有没有找到值的公式或过程?

使用字符数据类型对整数进行编码时,字符值从-128到127。值溢出了

500 - 127 = 373
373 - 128 = 245
245 - 127 = 118
118 - 128 = -10

因为我们两次超过0,这很重要,所以我们得到-12。如果您尝试打印字符,您将看到它是无效的,没有-12文本。您还可以检查
manascii

代码在语法上是正确的,但没有按照您的想法执行。 正如Paul Hankin建议的那样,当您试图设置一个不适合char变量中char的数字时,编译器应该给您一个警告

字符为1字节,因此如果有符号,它最多可以存储127个数字,如果无符号,它最多可以存储255个数字。 值溢出,只考虑较低的8位

500=0b111110100

仅取较低的8位:0b11110100

MSB是1,因此它是负数

1-补码加1等于0b00001100,即12

这就是你得到-12分的原因


用short或int替换应该可以正确打印500。

除非您知道给定系统的详细信息,否则您无法知道

char
通常只有8位宽,不能保存500的值。此外,
char
类型不适合存储整数值,因为它具有实现定义的符号性

这意味着您不知道它是否可以包含从0到255或从-128到127(两个的补码)的值。理论上,它甚至可以有其他约束和其他符号格式

此外,从大的无符号整数到小的有符号整数的转换也是实现定义的


我猜您的特定系统已经签名了8位
char
type和2的补码签名。500的原始值为
0x1F4
。初始化时,您的特定编译器将截断它以适应一个8位变量,这意味着您最终只得到最低有效字节,
0xF4
。因为您有一个8位的有符号变量,是2的补码格式,
0xF4
等于
-12

(printf执行的隐式类型升级保留符号。)

这些行为在不同的系统中都不能保证


不用说,代码是完全不可移植的。您不应该编写这样的代码,因为它严重依赖于许多形式的定义不好的行为

在这段代码中,ch是有符号字符类型,似乎是它的8位ascii码。。。 所以它的范围是从-128到+127(总共256)

现在让我们在这个ascii范围内循环,从0到127,然后从-128到0,如此。。。 整数的总值为500

从0到127和-128到0(整圈), 左整数值为500-256=244

从0到127, 左整数值为244-128=116。 从-128到-12, 左整数值为116-116=0

所以,在计算了所有500之后,我们的ascii范围为-12


“很抱歉,解释得太长,而且不是数学上的……我们的努力是让您理解”

编译器没有发出警告吗?当我编译此代码(gcc)时,我得到
警告:从'int'到'char'的隐式转换将值从500更改为-12[-Wconstant conversion]
据我所知,这不是语法错误。。这是一个有效的表达式。。但我不明白如何计算这个值……啊,我实际上是在用叮当声。尝试对gcc使用“-Wall”选项。假设8位字符(因此
中的CHAR\u bit==8
),则字符可以容纳256个不同的值。纯
字符
类型可以与
无符号字符
(0..255)具有相同的范围,也可以与
有符号字符
具有相同的范围(-128..+127,假设两个的补码)。在您的计算机上,似乎已对纯
char
进行签名。当存储值500时,额外(更有效)位被移除;最低有效8位存储在变量中-为+244或-12(-12,适用于您的系统)。当传递到
printf()
时,该值将转换为(有符号的)
int
。现在,如果询问您的人认为代码的行为定义良好,他们可能应该从教师角色退出,成为学生。蹩脚的编程老师是软件行业的一大瘟疫。嗯?这个奇怪的计算是什么?从大的无符号类型到小的有符号类型的转换通常意味着编译器将切掉多余的字节,留下ls字节。这只是计算转换的另一种方法。我看不出逻辑。为什么你有时要减去127,有时要减去128?还有,“我们两次超过0,这很重要”应该是什么意思?谢谢。。这帮了大忙……:)