【问题标题】:C ,help me in understanding this ASCII probC,帮助我理解这个 ASCII 问题
【发布时间】:2016-11-16 19:32:35
【问题描述】:

此代码将打印:

s = 1, i = 65537, f = 65537.000000, c = 1

我需要帮助来理解为什么它打印 c=1。

代码:

#include <stdio.h>  // Standard input-output library
#include <stdlib.h> // Standard general utilities library

int main(void) {
   int i = 65537;
   unsigned short s = (unsigned short)i;
   float f = (float)i;
   char c = (char)i;
   printf("s = %u, i = %d, f = %f, c = %d\n", s,i,f,c);
   system("PAUSE");
   return (0);
}

【问题讨论】:

  • @StoryTeller 如果您想查看数值,请不要。
  • c=1 出于同样的原因 s=1
  • (在您的机器上)字符是 8 位。 Int 是 32 位。不同之处在于 65537 完全适合 int 但不适合 char。你得到 1 因为 65537 % (2^8) = 1。
  • char 的大小(以字节为单位)是多少? int 的大小(以字节为单位)是多少?这些类型的最大值是多少?当一个数字溢出时会发生什么?
  • @BadZen:如果 char 已签名,则它是实现定义的,只有当我们知道实现是什么以及它如何处理它时,它才是“定义明确的”。链接的问题是关于unsigned char!

标签: c ascii


【解决方案1】:

如果要像这样以十六进制表示形式输出变量i

#include <stdio.h>

int main(void) 
{
    int i = 65537;

    printf( "%#0x\n", i );

    return 0;
}

然后你会看到它看起来像

0x10001

类型char 总是占用一个字节。因此在本次作业中

char c = (char)i;

对象i的一个字节

0x10001
     ^^

存储在变量c 中。

在你程序的printf 语句中

printf("s = %u, i = %d, f = %f, c = %d\n", s,i,f,c);
                                ^^^^^^

使用类型说明符%d 输出。所以它的内部值输出为int类型的整数。

通常unsigned short 类型的对象占用两个字节。因此在本次作业中

unsigned short s = (unsigned short)i;

对象i前两个字节的值

0x10001
   ^^^^

将分配给变量s

所以cs 的值都是1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2011-02-21
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2011-03-25
    • 2010-10-05
    相关资源
    最近更新 更多