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

时间:2016-02-09 07:15:09

标签: c character

最近在我的研究所,我得到了一个代码,并被要求找出答案。代码看起来像这样。

#include <stdio.h>
int main()
{
    char ch=500;
    printf("%d\n",ch);
}

输出将为-12

我的问题是:如何计算此类代码的值?是否有任何寻找价值的公式或流程?

4 个答案:

答案 0 :(得分:3)

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

char是1个字节,因此如果签名则可以存储最多127个数字,如果未签名则存储255个数字。 该值溢出,只考虑低8位。

500 = 0b111110100

仅采用低8位:0b11110100

MSB为1,因此它为负数。

1 - 补码加1是0b00001100,即12

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

用short或int替换它应正确打印500。

答案 1 :(得分:2)

除非您了解给定系统的具体细节,否则您无法知道。

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

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

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

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

(printf完成的隐式类型提升会保留符号。)

不同系统都不保证这种行为。

毋庸置疑,代码完全不可移植。你不应该编写这样的代码,它严重依赖于许多形式的定义不明确的行为。

答案 2 :(得分:0)

这里的代码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之后我们处于-12的ascii范围....

“对于长期和非数学解释感到抱歉....努力是让你明白”

答案 3 :(得分:-3)

使用char数据类型对整数进行编码时,char值从-128到127.该值溢出。

Error copying certificates

因为我们两次超过0而且很重要,所以它给了我们-12。如果您尝试打印该字符,您将看到它无效,没有-12字面值。您还可以查看500 - 127 = 373 373 - 128 = 245 245 - 127 = 118 118 - 128 = -10