user-0 提问: 作为菜鸟的关于c的一点疑问

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  printf Type Field Characters  See Also  Send Feedback     The type character is the only required format field; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.   Character  Type  Output format   c  int or wint_t  When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.   C  int or wint_t  When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.   d  int  Signed decimal integer.   i  int  Signed decimal integer.   o  int  Unsigned octal integer.   u  int  Unsigned decimal integer.   x  int  Unsigned hexadecimal integer, using "abcdef."   X  int  Unsigned hexadecimal integer, using "ABCDEF."   e  double  Signed value having the form [ – ]d.dddd e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or –.   E  double  Identical to the e format except that E rather than e introduces the exponent.   f  double  Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.   g  double  Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.   G  double  Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).   a  double  Signed hexadecimal double precision floating point value having the form [−]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.   A  double  Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.   n  Pointer to integer   Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.   p  Pointer to void  Prints the argument as an address in hexadecimal digits.   s  String   When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.   S  String  When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.    Note   If the argument corresponding to %s or %S is a null pointer, "(null)" will be printed.  Note   In all exponential formats, the default number of digits of exponent to display is three. Using the _set_output_format function, the number of digits displayed may be set to two, expanding to three if demanded by the size of exponent.  Security Note   The %n format is inherently insecure and is disabled by default; if %n is encountered in a format string, the invalid parameter handler is invoked as described in Parameter Validation. To enable %n support, see _set_printf_count_output.  See Also Concepts printf, _printf_l, wprintf, _wprintf_l Send feedback on this topic to Microsoft.

user: user-2
content: unsigned long index = 0; index -= 1; printf("%d\n", index);    //-1 printf("%hu\n", index);  //65535

user: user-0
content: 明白了，感谢楼上两位

user: user-3
content: %d不管你实际是什么,都当int在处理

user: user-4
content: %d还是4字节的，你取到的是1111 1111 1111 1111 xxxx xxxx xxxx xxxx。x86计算机是小端的，所以如果后2字节是全0的话，显示的就是65535了。  你可以在前后各设一个short变量来验证一下（我忘了栈的方向了，不知道应该是前还是后）

user: user-5
content: %d是整型，%hd才是短整型