gpt4 book ai didi

signed 和 unsigned char 之间的比较

转载 作者:行者123 更新时间:2023-12-01 23:15:19 26 4
gpt4 key购买 nike

我几乎认为这是一个愚蠢的问题……但我真的找不到答案。所以我在这里问这个问题。

为了学习隐式类型转换,我在 C 上运行以下代码。

#include <stdio.h>

int main()
{
unsigned char i;
char cnt = -1;

int a[255];

for (int k = 0; k < 255; k++)
{
a[k] = k;
}
for (i = cnt - 2; i < cnt; i--)
{
a[i] += a[i + 1];
printf("%d\n", a[i]);
}

return 0;
}

当我运行这个程序时,没有任何反应。

我在第一次迭代时发现for-loop的循环条件为false,所以程序立即退出了for-loop。

但是,我不明白为什么。

据我所知,C 在分配或比较不同类型的变量时会进行隐式转换。所以我认为 i = cnt - 2 ,减号操作使值 -3,然后隐式转换为 i 分配值 253。

那么,条件i < cnt不应该吗?是真的,因为(由于有符号和无符号字符的比较,通过 cnt 的另一个隐式转换)253 小于 255?

如果不是,为什么这是错误的?是否有我遗漏的内容或是否有我不知道的异常(exception)情况?

最佳答案

你的问题一点也不蠢。您接近解决方案:i被赋值为 -3但是隐式转换为 i 的类型, unsigned char , 将值更改为 253 .

为了更准确的解释,您的测试代码中存在多个问题:

  • char根据平台和编译器配置,可以签名或未签名,所以 char cnt = -1;可以存储值 -1255进入cnt ,或者如果 char 甚至是其他值无符号且多于 8 位。

  • for (i = cnt - 2; i < cnt; i--) 的行为还取决于是否char默认情况下是签名还是未签名:

    • 在所有情况下,测试 i < cnt计算时将两个操作数都转换为 int (或 unsigned int 在极少数情况下 sizeof(int)==1 )。如果int可以表示类型的所有值 charunsigned char ,此转换不会更改值。

    • 如果 char无符号且有 8 位,cnt具有值 255所以i用值 253 初始化循环运行 254 次 i来自 253下降到 0 , 然后 i--存储值 255再次进入i ,为此测试i < cnt评估为假。循环打印 507 , 然后 759 , ... 32385 .

    • 如果 char已签名且有 8 位,您的系统可能就是这种情况,cnt具有值 -1i用值 -3 初始化转换为 unsigned char ,即 253 .初试i < cnt评估为 253 < -1 ,这是错误的,导致立即跳过循环体。

你可以强制char通过为编译器提供适当的标志(例如:gcc -funsigned-char)默认情况下未签名并测试行为如何变化。使用Godbolt's compiler explorer , 你可以看到 gcc仅生成 2 条指令以在有符号(默认)情况下返回 0,在无符号情况下返回预期输出。

关于signed 和 unsigned char 之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69029798/

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