为什么我必须将%u与unsigned int一起使用,而我可以将%i与unsigned char一起使用?

时间:2018-12-28 16:24:22

标签: c types

我试图在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;
}

2 个答案:

答案 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。