【问题标题】:Need help in my C code - Getting unexpected output [duplicate]在我的 C 代码中需要帮助 - 获得意外的输出 [重复]
【发布时间】:2020-01-10 03:45:31
【问题描述】:
#include <stdio.h>

int main()
{
int a = -1;
char *p = &a;
printf("%x, %x",*p, *(p+1));
return 0;
}

output is = ffffffff,ffffffff

我知道有符号整数表示为 ffffffff。

* 预期结果应该只打印一个字符,因为它是 char *

*(p+1) 是怎样的 ffffffff ?

有什么区别

char *p = &a;

char *p;
p = &a;

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?
  • 我正在尝试理解带符号数字的指针?
  • @rafix07,我一发布就删除了我的评论,因为我错过了 OP 使用字符指针指向 int 的事实。
  • 注意char *p = &amp;a;char *p; p = &amp;a;的效果是一样的。
  • 它的 char * 所以它应该只打印 1 个字节,即 ff ?

标签: c pointers hex


【解决方案1】:

int 超过一个字节(多少取决于您的系统)。所以int a = -1; 将至少 2 个字节(或更多)设置为FF。现在您创建一个字节指针*p 并指向您的a 整数的第一个字节的地址。当您对字节使用格式 x% 时,该字节将被填充到 int

当您尝试使用*(p+1) 打印int 的第二个字节时,%x 也会将ff 的输出填充为完整的int

更新: 该过程称为“符号扩展”,当使用较小的值代替较长的值时,较小的值被“扩展”,如果符号为正,则向左填充零,而如果符号为正,则向左填充零。为负数,将向左填充字节,以便将字节 FF 视为 int FFFFFFFF 而不是 000000FF。这被认为是 C 的“特征”,因此 -1 仍然是 -1。

【讨论】:

  • 表示输出是未定义的行为?
  • 它不是未定义的。它被称为“符号扩展”,是一种“功能”。
  • 什么是符号扩展,请在您的答案中添加?
  • char *p = &a 和 char *p 有什么区别; p = &a ;如果一样怎么办?
  • 请在您的回答中添加上述问题的答案。
【解决方案2】:

要将变量转换为unsigned char,您可以使用以下格式:

printf("%hhx, %hhx",*p, *(p+1));

您可以尝试以下代码的输出,也许您会得到更好的主意:

#include <stdio.h>

int main()
{
    int a = 0xaf0e3b;
    char *p = &a;
    printf("%hhx, %hhx, %hhx",*(p + 2), *(p+1), *p);
    return 0;
}

出来:

af, 0e, 3b

【讨论】:

    【解决方案3】:

    首先 - [Error] cannot convert 'int*' to 'char*' in initialization

    要打印字符,请使用%c 而不是%x

    %x 表示 printf 将以十六进制格式输出其值。

    运行此代码 - (获取空格()和逗号(,)作为输出)

    int main() {
       int a = -1;
       char *p = (char *)&a;
       printf("%c, %c",*p, *(p+1));
       return 0;
    }
    

    【讨论】:

    • 如果您的编译器对此不满意,可以使用char *p = (char*)(&amp;a);
    • %c 格式化0xff 值并不是一个好主意,因为它不是可打印的字符,因此不会提供任何重要信息。
    • 它只会复制1个字节,打印将基于字节序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2019-05-30
    • 2015-06-26
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多