能力值:
( LV2,RANK:10 )
|
-
-
2 楼
第一个问题:FFFFFF85也是有符号数啊,只不过是输出的位数不对吧。
第二个:在C语言中,好像局部变量的声明必须放在一个语句块的开始处。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
1、%X本身输出就是无符号的,要带符号自己判断
2、C语言中变量定义貌似要在函数前面,不能中间定义,C++可以随意
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
CODE1应该是正确的,估计是你的运行环境选择错了。。
CODE报错是因为
“C语言中所有的变量定义语句必须放在执行语句之前(即变量定义要放在函数的最开始几行),否则就会出错”
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
那要怎么才能让它输出正确的FF85呢
|
能力值:
( LV3,RANK:25 )
|
-
-
6 楼
&0xffff
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
这就是`printf`的弊端了, 你传递进去的参数的实际类型是被丢弃了的, 函数内部会按照你的格式字符串中的信息来解读参数, `%x`要求的输入是一个`unsigned int`, 而且它也没办法验证你给出的参数到底是不是这个类型, 所以你不管传什么类型的参数, 都只能被当做`unsigned int`来解读.
这个问题用纯C如果不修改接口应该是没法解决的, 但是c++的variadic template可以很轻松的写出类型安全的`printf`
template<typename T, typename... Args>
void printf(const char *s, T value, Args... args)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
std::cout << value;
printf(s + 1, args...); // call even when *s == 0 to detect extra arguments
return;
}
}
std::cout << *s++;
}
throw std::logic_error("extra arguments provided to printf");
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
第一个:printf("%hX \n", short_i);
你想要的应该是这个吧。printf不是跟进后面的参数列表判断输出的,而是根据第一个参数。第一个参数的完整格式是%[flags][width][.precision][length]specifier,详细解释看这http://www.cplusplus.com/reference/cstdio/printf/
第二个:C语音要求所有定义在函数开始位置。
这个是有原因的,C语音诞生的年代汇编还是很普遍的,C语音很接近汇编。函数的开始位置通常会先修改栈寄存器,把所有局部变量的空间预留出来,所以C语音的局部变量也是要求在函数开始位置申请。之后C++中对这个约束进行了改进。而且这个函数在起始位置定义变量,还和到后来被认为有害的goto语句有一些关联,C++中就体现这个限制。
|
能力值:
( LV9,RANK:175 )
|
-
-
9 楼
用%#X这个格式应该能输出前导符。
|
能力值:
( LV9,RANK:175 )
|
-
-
10 楼
第二个我运行时也没报错啊,编译通过。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
上面已说的很清楚
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
学习了,呵呵呵
|
|
|