将 ASCII 代码点值存储在浮点数中可以防止将其解释为字符(在 C 中)

问题描述 投票:0回答:1
float c;
c = 'a';
while (c <= 'z')
{
    write(1, &c, 1);
    c++;
}

write() 与数据类型无关。 它应该向终端传送正确的代码点值。 然后,终端应根据其字符编码方案(通常是 UTF-8)来解释它。

问题 为什么此代码输出空行而不是字母表? (这个问题的目标是了解工作的底层机制)

我检查过的内容 我打印出了每个递增的 c 的浮点值。 我似乎总是得到正确的代码点值(“t”为 116.0000000,“u”为 117.0000000 等) 我怀疑问题是由于将代码点值存储为浮点数而引起的,这可能会以某种方式导致精度损失。

c floating-point character precision system-calls
1个回答
0
投票

您要求写入浮点数的第一个字节。这不会产生任何有用的东西。

让我们看看这个程序:

char c = 'a';
write(1, &c, 1);

int i = 'a';
write(1, &i, 1);

float f = 'a';
write(1, &f, 1);

首先,

'a'
只是
65
[1]的另一种写法,这是一个
int
值。

c
i
f
都会被初始化为值65,但不同类型的存储方式不同。

  • A
    char
    ,其值为
    65
    存储为字节
    41
    (十六进制)。[1]
  • 具有值
    int
    65
    存储为字节
    00 00 00 41
    00 00 00 00 00 00 00 41
    [1]
  • 具有值
    float
    65
    将存储为字节
    00 00 82 42
    [1]

write
的后续调用将输出这些字节中的第一个字节。

  • 41
    char
    。您的终端将其显示为
    a
    .[1]
  • 00
    int
    。您的终端可能会将其显示为空白区域。
  • 00
    float
    。您的终端可能会将其显示为空白区域。

  1. 我假设一个现代桌面系统。
© www.soinside.com 2019 - 2024. All rights reserved.