gpt4 book ai didi

c++ - 处理 char 整数

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:35 28 4
gpt4 key购买 nike

我有以下问题。将某个字符(作为整数)乘以 -1 两次是否保证保留初始值?

所以,我运行了一些代码,通过将它乘以 -1 来标记一个读取的字符(我生活在一个 ASCII 世界中,但任何其他符号编码也很值得评估) .

例如,假设我已经将一个英文字母'a'读入变量c。为了防止进一步的代码检测到它是小写字母 I 想将它乘以 -1。毕竟这是一个整数。

代码基本上是对某个问题的回溯解决,所以在检查完决策树分支后,我想将字母的初始值返回给自己。

char c;
// some code gets the value
c *= -1;
// handle something
c *= -1;

面临的问题更多的是我应该期待什么?,而不是有些东西没有按预期工作

我要转换的字符都是英文字母,可能是大写也可能是小写。

根据我在 ASCII 表中看到的内容,这两个类都在 0..127 范围内。

如果

1) char 在我的机器上签名,我应该期望 negative 字母不是常规字母。哪个好。2) char 是unsigned。我没有任何线索。是否应在 int 中执行乘以 -1,然后截断为 char

既然标准不要求符号是 ASCII,那么其他编码的结果会有所不同吗?

最佳答案

Does multiplying some character (as integer) by -1 twice guaranteed to preserve the initial value?

嗯,只考虑这个问题,是的,确实如此;在这两种情况下,有符号或无符号,都会发生隐式整数提升(这是标准强制要求的)并且计算将在 int 中完成。无论如何(除非 unsigned char 和 signed int 恰好具有相同的大小,然后 unsigned int 代替)。

有符号字符:x * -1结果 -x ,结果值适合 signed char,很好,我们可以进行赋值 (exception: -128; 对于这种情况,我们得到未定义的行为!但是我们可以 - 考虑 ASCII - 将其排除为输入,我们很好...)。

Unsigned char 看起来有点困难:同样,我们得到 -x结果,但需要将其放入 unsigned char .根据C标准,我们需要添加UCHAR_MAX + 1多次直到值适合变量,在给定的情况下,我们因此得到 256 - x .第二次乘法结果为 x - 256作为 int 值,再次添加 256 直到值适合变量(记住,x 本身已经这样做了)消除了负偏移...

旁注:添加 [TYPE]_MAX +1多次直到值适合变量只是切断二进制补码机上多余的最高有效位...

只有数值0会有问题,因为它不会改变它的值(value)。但这又一次没有显示为有效输入,我们没问题。

Since, the standard does not require symbols to be ASCII, would the result in other encodings be different?

不,到目前为止没有任何区别——char 是有符号的还是无符号的。

但是:您希望如何检测标识为无效的值?使用 ASCII(和兼容),它很简单,所有有问题的值(仅限英文字母!)都在范围 [0; 127],您通过检查 < 0 来识别无效的如果是 signed char 或 > 128如果是无符号字符。这同样适用于任何其他只对相关字母使用下半部分或上半部分的编码(这甚至适用于臭名昭著的 EBCDIC 编码,只是这次有问题的字符位于 upper half of the [0; 255] 范围内,您需要反转检查)。但是,如果您遇到使用字节值范围的两半的编码(我不知道有任何),这个简单的检查将不再起作用。但是,使用 EBCDIC 时,您可能会因单词分隔符而遇到这个麻烦:e。 G。简单的空格字符 ' ' , 但大多数标点符号也已经位于字母的另一半(如果你使用这样的标点符号,你没有提到......)!

关于c++ - 处理 char 整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57250324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com