user-0 提问: %x和%hx有什么区别？16进制数最高位不取正负吗？oxF7输出%hx为什么是FFF7?

回复:
user: user-1
content: 引用 13 楼 S_GKCYY 的回复:[quote=引用 10 楼 寻开心 的回复:] 125 = 0111  1101 ~125=1000 0010  在有符号情况下，因为高位是1，表示负数 根据负数的补码规则， 各位取反再1 所以对于这个数要反过来操作 1000 0010 -1 = 1000 0001 取反 0111 1110  这就是126 谢谢，那126前面不用再加负号了吗？[/quote]  加不加是看你如何用这个数    如果当做无符号整数理解，~125=1000 0010  它就是130了    当做有符号整数， 才有高位判断的问题， 结果才是 -126   这里必须加负号的。

user: user-0
content: 引用 18 楼 user-3 的回复:符号扩展是正数填充全0，负数填充全1，并且参数都是在栈上面，应该是全部扩展为32位 引用 18 楼 user-3 的回复:符号扩展是正数填充全0，负数填充全1，并且参数都是在栈上面，应该是全部扩展为32位 谢谢，我明白了。

user: user-2
content: * An optional h specifying that a following d , i , o , u , x , or X    conversion specifier applies to a short int or unsigned short int    argument (the argument will have been promoted according to the    integral promotions, and its value shall be converted to short int or    unsigned short int before printing); an optional h specifying that a    following n conversion specifier applies to a pointer to a short int    argument; an optional l (ell) specifying that a following d , i , o ,    u , x , or X conversion specifier applies to a long int or unsigned    long int argument; an optional l specifying that a following n    conversion specifier applies to a pointer to a long int argument; or    an optional L specifying that a following e , E , f , g , or G    conversion specifier applies to a long double argument.  If an h , l ,    or L appears with any other conversion specifier, the behavior is    undefined.

user: user-3
content: 符号扩展是正数填充全0，负数填充全1，并且参数都是在栈上面，应该是全部扩展为32位

user: user-0
content: 引用 14 楼 user-3 的回复:0x是告诉编译器，这是一个十六进制数，输出的时候不需要这个标记，并且一般十六进制是用H标记，比如88H。 F7在符号扩展以后就是FFFF FFF7，因为格式是hx，所以只输出低16位，格式x就可以全部输出。你可以试试 谢谢。符号扩展是用15填满每一位吗？还是用16进制数的最高位填满每一位？

user: user-3
content: 0x是告诉编译器，这是一个十六进制数，输出的时候不需要这个标记，并且一般十六进制是用H标记，比如88H。 F7在符号扩展以后就是FFFF FFF7，因为格式是hx，所以只输出低16位，格式x就可以全部输出。你可以试试

user: user-0
content: 引用 10 楼 寻开心 的回复:125 = 0111  1101 ~125=1000 0010  在有符号情况下，因为高位是1，表示负数 根据负数的补码规则， 各位取反再1 所以对于这个数要反过来操作 1000 0010 -1 = 1000 0001 取反 0111 1110  这就是126 谢谢，那126前面不用再加负号了吗？

user: user-0
content: 引用 5 楼 user-3 的回复:[quote=引用 3 楼 S_GKCYY的回复:][quote=引用 1 楼 user-3 的回复:] hx就是short的十六进制格式 都是16进制，为什么ox88要输出为88呢？[/quote] 为什么不是88？你认为应该是多少呢？[/quote] 那oxF7为啥输出是FFF7?恩。。。。

user: user-0
content: 引用 5 楼 user-3 的回复:[quote=引用 3 楼 S_GKCYY的回复:][quote=引用 1 楼 user-3 的回复:] hx就是short的十六进制格式 都是16进制，为什么ox88要输出为88呢？[/quote] 为什么不是88？你认为应该是多少呢？[/quote] 我以为就输出ox88呢，好吧，我又傻了

user: user-1
content: 125 = 0111  1101 ~125=1000 0010  在有符号情况下，因为高位是1，表示负数 根据负数的补码规则， 各位取反再1 所以对于这个数要反过来操作 1000 0010 -1 = 1000 0001 取反 0111 1110  这就是126

user: user-0
content: 引用 7 楼 S_GKCYY 的回复:~125=-123；~130=124对吗？ ~125=-126

user: user-1
content: unsigned  char s = 0x08;     unsigned  char s1 = ~s;     unsigned  char s2 = 130;     unsigned char s3 = ~s2;     printf("s=%d, %x\n", s, s1);     printf("s=%d, %x\n", s2, s3); 你用这种方式来检测，就可以避免前面的位数的问题了

user: user-0
content: ~125=-123；~130=124对吗？

user: user-1
content: 就是hx的格式是 unsigned short的意思， 这个是16位，  而char 是8位，  位数不匹配  %x实际上是输出一个16进制的整数， int现在基本上都是32位， 和char类型也是不匹配的  你要看关系，最好把位数统一了再使用

user: user-3
content: 引用 3 楼 S_GKCYY的回复:[quote=引用 1 楼 user-3 的回复:] hx就是short的十六进制格式 都是16进制，为什么ox88要输出为88呢？[/quote] 为什么不是88？你认为应该是多少呢？

user: user-0
content: 引用 2 楼 寻开心 的回复:把char s改成int s  char才一个字节，后面指定的输出类型可不是一个字节 不是很明白。。。。这是老师网课课件的截图。

user: user-0
content: 引用 1 楼 user-3 的回复:hx就是short的十六进制格式 都是16进制，为什么ox88要输出为88呢？

user: user-1
content: 把char s改成int s  char才一个字节，后面指定的输出类型可不是一个字节

user: user-3
content: hx就是short的十六进制格式