c - printf 函数如何处理整数?

标签 c

我有以下代码

int main()
{
    int arr[3] = {2, 3};
    char *p;
    p = arr;
    p = (char *)((int*)(p));
    printf("%d, ", *p);
    p++;
    p = (int*)(p+1);
    printf("%d", *p);
    return 0;
}

o/p-2,0

但我想知道它是如何在第二个 printf 中打印 0 的,我知道所有关于 little-endian 的东西,就像在 4 字节整数 的内存中这些元素是如何存储,如下

00000010 00000000 0000000 00000000 00000011 00000000 00000000 00000000

因此,在第一个 printf 期间我们得到 2 作为答案,但在第二个 printf 期间指针位于 second byte 处,这是 0 但它现在是一个整数指针,但它是如何打印 0 的,因为它必须检查最多 4 个字节的内存然后它必须打印整个数据最多 4 个字节。 我认为将是 3,因为它将打印最多 4 个字节。

我想要的是整数数据是如何通过printf打印的,有人能告诉我吗

最佳答案

指针 p 的类型不会随着以下两者中的任何一个而改变:p = (char *)((int*)(p)); p = (int*)(p+1);.

它仍然是指向 char 的指针。

强制转换仅适用于改变表达式中的值(或类型)。它适用于从变量中提取的值的副本,但不会修改这些变量。表达式结束后,强制转换连同它关联的值副本一起消失。

例子:

signed char c = -1;
int i;
i = (unsigned char)c;

此处 c 的值 -1 被转换/强制转换为 unsigned char 类型。如果 chars 是 8 位,(unsigned char)-1 的结果是 255,这个值是 unsigned char 类型,然后被转换为 int 并分配给 i

c在上述过程中并没有发生任何变化。

示例 2:

unsigned u = 0x55AA;
unsigned* pu = &u;
unsigned char* pc = (unsigned char*)pu;

此处 pu 被转换/强制转换为指向 unsigned char 的类型指针。该转换不会修改变量 pu,它只会更改其值的副本。在这里它只是改变了副本的类型,而不是指针变量中包含的实际地址。然后这个地址的副本被分配给pc。需要强制转换以避免编译器警告/错误,因为编译器有权“想知道”这里发生了什么,以及是否可能存在编程错误。

现在 pupc 都指向同一个位置,即变量 u 的开头。但它们有不同的类型,一个指向 unsigned char,另一个指向 unsigned int

因此,如果您取消引用 pupc,您将获得不同的值,并且它们的类型也不同。

同样,如果你对两个指针进行指针运算,比如每一个都加1,它们会提前指向内存中的不同位置。 pu+1 将指向 u 结束后的位置,pc+1 将指向第二个 unsigned charu 开始。

你开始看到了吗?

关于c - printf 函数如何处理整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669164/

相关文章:

c - 从 gchar 缓冲区 (libcurl) 向 ftp 服务器发送图像

c - 为什么这个程序有意外的指针值?

arrays - 对数组中大于 n 的元素按升序排序并在 C 中降序排列

iPhone - gcdasyncsocket 委托(delegate) Didreceive 在其他 View 中不起作用

c - 如何使用用户输入打开文本文件,然后将其加载到二维数组中?

c - 使用 PocketSphinx 打印置信度值

C 中的字符比较

使用 eclipse 和 mingw 的控制台应用程序(不在 cms.exe 中启动应用程序)

c - 链表的链表 C

c - 用 getdelim 填充二维数组,在循环内工作但不在循环外