我非常困惑。我头疼。 我是C的新手。
#include<stdio.h>
int main()
{
int i = 257;
int *iPtr = &i;
printf("val 1: %d \t val 2: %d \n\n",*( (char*)iPtr ), *( (char*)iPtr+1) );
int iptr_alias = iPtr;
int and_val = iptr_alias & 255;
printf("Value of iPtr (aka address of i): %d \n\n", iPtr);
printf("Value at location pointed to by iPtr using %%c: %c \n\n",*iPtr); //gives weird character
int f = 257;
int *fptr = &f;
printf("char starred fptr: %d \t charred 257: %d \n\n",*((char*)fptr), ((char)257) );
// i know the above is obvious.
system("PAUSE");
}
我的问题:
1。显然*( (char*) iPtr )
= 257 & 255
= 1(按位和操作)。
(char)*iPtr
也是一样。但如果我使用1
修饰符,则不会打印%c
。为什么呢?
2。为什么*( (char*) iPtr+1 )
= 1 ??
我对这一切感到困惑(我自己写的是为了清除混淆,但它起了作用......)
((char)257)
使用1
或%o或%x来%d
。 %c
给出了一些奇怪的ASCII字符
我的意思是,当我printf(" %c ", 257)
时,我没有得到1
,相反,我得到了一个奇怪的ASCII字符。为什么呢?
在实际问题中,我应该确定将打印为val 1
和val 2
的内容。
我可能会忽略任何愚蠢的事情,但我真的对这种混乱感到困惑和厌倦。 请帮忙。
答案 0 :(得分:1)
请记住,char
只有8位,因此可以表示0到255之间的数字。当您打印257
时,它会翻转并变为1(256
将为零)
至于为什么257
(即1
)成为一个奇怪的角色,我会引导你去ASCII table。
修改:关于signed
与unsigned
在这种情况下,您的char
类型为unsigned
。如果是signed
,那么翻转就会发生在127
(但是由于签名/未签名的工作方式,它会转移到-128
而129
会转到-127
)。
答案 1 :(得分:1)
整数257也是十六进制的0x101。在具有32位整数的小端机器上,各个字节将为0x01 0x01 0x00 0x00。