我试图在C中使用数据类型。我的第一个问题是printf()显示带有负数int的负值。我用%u而不是%i修复了这个问题。
但是未签名的char仍然可以与%i一起使用,怎么可能?
#include <stdio.h>
int main(void) {
unsigned int a;
unsigned char b;
a = -7;
b = -1
printf("a=%u\nb=%i\n", a, b);
return 0;
}
答案 0 :(得分:1)
如果您看到例如this printf
(and family) reference,您会看到use Validator;
public function getUsername($username)
{
$validator = Validator::make(['username' => $username], [
'username' => 'required|string'
]);
if ($validator->fails()) {
return response()->json(['success' => false, 'errors' => $validator->messages()], 422);
}
}
格式可以做到
将有符号整数转换为十进制表示
"%i"
。
[强调不是我的]
自从传递[-]dddd
以来,格式说明符和值不匹配,从而导致undefined behavior。
此外,对于可变参数函数(例如unsigned int
),小于printf
(例如int
,有符号或无符号)的参数是promoted至{{1} }。同样,由于结果值是char
(已签名)并且您使用int
格式,因此格式说明符和参数类型之间不匹配。
答案 1 :(得分:0)
如前所述,对于类型为 unsigned char的变量,使用'i'作为格式说明符是不正确的。
每当不确定任何特定(整数)类型的正确格式时,都可以查看inttypes.h,其中包含一堆旨在用于可移植格式字符串的宏。视您要开发的平台而定,正确的格式说明符可能会有所不同(例如,uint16_t可以是“ u”或“ hu”,例如int32_t可以是“ d”或“ ld”)。
您可以将此标头用作“备忘单”,也可以这样写格式字符串:
printf("a=%"PRIu32"\nb=%"PRIu8"\n", a, b);
请注意,要使代码真正可移植,您当然还需要使用uint8_t代替无符号字符,并使用uint32_t代替int。