((char)257)用C打印1?

时间:2012-09-25 16:53:18

标签: c char-pointer

我非常困惑。我头疼。 我是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 1val 2的内容。

我可能会忽略任何愚蠢的事情,但我真的对这种混乱感到困惑和厌倦。 请帮忙。

2 个答案:

答案 0 :(得分:1)

请记住,char只有8位,因此可以表示0到255之间的数字。当您打印257时,它会翻转并变为1(256将为零)

至于为什么257(即1)成为一个奇怪的角色,我会引导你去ASCII table

修改:关于signedunsigned

在这种情况下,您的char类型为unsigned。如果是signed,那么翻转就会发生在127(但是由于签名/未签名的工作方式,它会转移到-128129会转到-127)。

答案 1 :(得分:1)

整数257也是十六进制的0x101。在具有32位整数的小端机器上,各个字节将为0x01 0x01 0x00 0x00。