字符数组打印输出?

wbuzhou 2012-12-07 12:54:30
需要合并字符数组中低4位,比如char a[4] = {0x07,0x09,0x03,0x08};经代码后想得到b[2]={0x97,0x83}
写了源代码如下,可是打印的输出令我意外
main()
{
char a[4] = {0x07,0x09,0x03,0x08};
char b[2] ;
int i;
b[0] = a[1]<<4 | a[0];
b[1] = a[3]<<4 | a[2];

for(i=0;i<2;i++)
{
printf("b[%d] = %x\n",i,b[i]);
}

}
打印输出:
b[0] = ffffff97
b[1] = ffffff83
Press any key to continue
...全文
520 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
joleenwang 2012-12-12
  • 打赏
  • 举报
回复
为什么ffffff97换算为十进制后是-17呢,我怎么算的是-69
wbuzhou 2012-12-11
  • 打赏
  • 举报
回复
还一个问题啊,顶楼中 main() { char a[4] = {0x07,0x09,0x03,0x08}; char b[2] ; int i; b[0] = a[1]<<4 | a[0]; b[1] = a[3]<<4 | a[2]; for(i=0;i<2;i++) { printf("b[%d] = %x\n",i,b[i]); } } 打印输出: b[0] = ffffff97 b[1] = ffffff83 这个吧b[0]本来存放的是有符号字符,但打印出来的是ffffff97 这个值具体是怎么计算出来的。我是这样计算的,和打印出来的结果不一致 97,既然有符号,换成10进制是-17,该值在计算机中的存放为其补码,也就是 原码: 1000 0000 0000 0000 0000 0000 0001 0111 反码 1111 1111 1111 1111 1111 1111 1110 1000 补码 1111 1111 1111 1111 1111 1111 1110 1001 即 f f f f f f e 9 FFFF FFE9, 呵呵,咋就算出了这个不对的值
guotianyu2000 2012-12-11
  • 打赏
  • 举报
回复
因为char a = '0x97'这个赋值过程迷惑了你,这个过程其实是将四个字符依次存到以a字符地址起始的位置,但是字符a只能存放一个字符,所以最后打印的是字符'7',其十六进制为0x37。
赵4老师 2012-12-11
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看文件或内存中的原始字节内容。
赵4老师 2012-12-11
  • 打赏
  • 举报
回复
C++ Character Constants Character constants are one or more members of the “source character set,” the character set in which a program is written, surrounded by single quotation marks ('). They are used to represent characters in the “execution character set,” the character set on the machine where the program executes. Microsoft Specific For Microsoft C++, the source and execution character sets are both ASCII. END Microsoft Specific There are three kinds of character constants: Normal character constants Multicharacter constants Wide-character constants Note Use wide-character constants in place of multicharacter constants to ensure portability. Character constants are specified as one or more characters enclosed in single quotation marks. For example: char ch = 'x'; // Specify normal character constant. int mbch = 'ab'; // Specify system-dependent // multicharacter constant. wchar_t wcch = L'ab'; // Specify wide-character constant. Note that mbch is of type int. If it were declared as type char, the second byte would not be retained. A multicharacter constant has four meaningful characters; specifying more than four generates an error message. Syntax character-constant : 'c-char-sequence' L'c-char-sequence' c-char-sequence : c-char c-char-sequence c-char c-char : any member of the source character set except the single quotation mark ('), backslash (\), or newline character escape-sequence escape-sequence : simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence simple-escape-sequence : one of \' \" \? \\ \a \b \f \n \r \t \v octal-escape-sequence : \octal-digit \octal-digit octal-digit \octal-digit octal-digit octal-digit hexadecimal-escape-sequence : \xhexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit Microsoft C++ supports normal, multicharacter, and wide-character constants. Use wide-character constants to specify members of the extended execution character set (for example, to support an international application). Normal character constants have type char, multicharacter constants have type int, and wide-character constants have type wchar_t. (The type wchar_t is defined in the standard include files STDDEF.H, STDLIB.H, and STRING.H. The wide-character functions, however, are prototyped only in STDLIB.H.) The only difference in specification between normal and wide-character constants is that wide-character constants are preceded by the letter L. For example: char schar = 'x'; // Normal character constant wchar_t wchar = L'\x81\x19'; // Wide-character constant Table 1.2 shows reserved or nongraphic characters that are system dependent or not allowed within character constants. These characters should be represented with escape sequences. Table 1.2 C++ Reserved or Nongraphic Characters Character ASCII Representation ASCII Value Escape Sequence Newline NL (LF) 10 or 0x0a \n Horizontal tab HT 9 \t Vertical tab VT 11 or 0x0b \v Backspace BS 8 \b Carriage return CR 13 or 0x0d \r Formfeed FF 12 or 0x0c \f Alert BEL 7 \a Backslash \ 92 or 0x5c \\ Question mark ? 63 or 0x3f \? Single quotation mark ' 39 or 0x27 \' Double quotation mark " 34 or 0x22 \" Octal number ooo — \ooo Hexadecimal number hhh — \xhhh Null character NUL 0 \0 If the character following the backslash does not specify a legal escape sequence, the result is implementation defined. In Microsoft C++, the character following the backslash is taken literally, as though the escape were not present, and a level 1 warning (“unrecognized character escape sequence”) is issued. Octal escape sequences, specified in the form \ooo, consist of a backslash and one, two, or three octal characters. Hexadecimal escape sequences, specified in the form \xhhh, consist of the characters \x followed by a sequence of hexadecimal digits. Unlike octal escape constants, there is no limit on the number of hexadecimal digits in an escape sequence. Octal escape sequences are terminated by the first character that is not an octal digit, or when three characters are seen. For example: wchar_t och = L'\076a'; // Sequence terminates at a char ch = '\233'; // Sequence terminates after 3 characters Similarly, hexadecimal escape sequences terminate at the first character that is not a hexadecimal digit. Because hexadecimal digits include the letters a through f (and A through F), make sure the escape sequence terminates at the intended digit. Because the single quotation mark (') encloses character constants, use the escape sequence \' to represent enclosed single quotation marks. The double quotation mark (") can be represented without an escape sequence. The backslash character (\) is a line-continuation character when placed at the end of a line. If you want a backslash character to appear within a character constant, you must type two backslashes in a row (\\). (SeePhases of Translation in the Preprocessor Reference for more information about line continuation.)
wbuzhou 2012-12-10
  • 打赏
  • 举报
回复
main() { char a= '0x97'; printf("%x",a); } 打印结果是0x37,,这个值是怎么算出来的呢?
mymtom 2012-12-07
  • 打赏
  • 举报
回复
printf("b[%d] = %x\n",i,b[i]); ===> printf("b[%d] = %x\n",i,(unsigned char)b[i]);
wbuzhou 2012-12-07
  • 打赏
  • 举报
回复
thank you! 那为什么有unsigned char和char类型之分呢?
骁Captain 2012-12-07
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
    unsigned char a[4] = {0x07,0x09,0x03,0x08};
    unsigned char b[2] ;
    int i;
    b[0] = (a[1]<<4) | a[0];
    b[1] = (a[3]<<4) | a[2];

    for(i=0;i<2;i++)
    {
        printf("b[%d] = %x\n",i,b[i]);
    }
    return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧