C,帮助我理解这个 ASCII 问题

Posted

技术标签:

【中文标题】C,帮助我理解这个 ASCII 问题【英文标题】:C ,help me in understanding this ASCII prob 【发布时间】: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! 【参考方案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。

【讨论】:

以上是关于C,帮助我理解这个 ASCII 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用inotify 帮助理解代码的C 程序

帮助我理解和修复这个算法

写入文本文件,二进制与 ascii

待签名参数按照字段名的ascii码从小到大排序 怎么理解

请帮助我理解这个 PL/SQL

我需要帮助理解这个 openMP 示例