c++如何一个char变量输出128个以上

fcwjkofz  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(143)

下面是我的代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    char a = 129;
    printf("%d", a);
}

输出:-127
我想知道129怎么变成-127。

but5z9lq

but5z9lq1#

字符大小为1字节。默认情况下,如果未指定,则字符带符号,因此MSB 1位用于指示符号(0表示正数,1表示负数)
129在二进制中是1000 0001,MSB 1表示它的负数。负数以2的补码形式存储(这意味着我们首先求反/反转数字,然后加1以获得实际值):
原件:1000 0001
否定:0111 1110
添加1:0111 1111
得到-127
更进一步,如果我们定义一个无符号字符,那么所有8位都用于指示数值,并且不能表示负数。由于范围增加到255,所以可以很好地表示129,如以下代码片段所示。
现在,如果我们取一个负数为无符号,它的值将是该负数的2的补码表示。例如-1在2的补码计算如下:
原件:0000 0001
否定:1111 1110
加一:一一一一一一一一
因此我们得到255,如下面代码示例所示。

int main()
{
   char a = 129; // by default its signed char
   unsigned char b = 129;
   char c = -1;
   unsigned char d = -1;

   printf ("sizeof(char) %d %d\n",sizeof(a), sizeof(b));
   printf("%d\n", a);
   printf ("%d\n", b);
   printf ("%d\n", c);
   printf ("%d\n", d);
}

输出:
大小(字符)1 1
-127
129
-1
255

ia2d9nvy

ia2d9nvy2#

这是你拥有的一点点代码,但你已经可以从中学到很多东西了。一个是永远不要忽视编译器警告:)
下面是一些经过修改的代码,可以帮助您进行解释:

// #include <bits/stdc++.h> // NO never use this it is NOT a standard header file 
// using namespace std; // NO never use using namespace std; (using namespace is not recommended at all in big projects).

#include <iostream> // for console output
#include <format>   // C++20 replacement for printf
#include <limits>   // get information on maximum and minimum values

int main() 
{
    // NEVER ignore your compiler warnings. The compiler already warns value will not fit!!!
    // \temp\main.cpp(11,14): warning C4309: 'initializing': truncation of constant value
    char a = 129; // a signed char will not hold this.
    // printf("%d", a); // printf can be used, but is considered "unsafe" (can lead to buffer overflows)

    std::cout << std::format("the value of your number {}\n", a); // C++20

    // in the following code the casts are necessary to convert from char to a size value (otherwise output will show control characters)
    std::cout << "the minimum value in a char = " << static_cast<std::size_t>(std::numeric_limits<char>::min()) << "\n"; 
    std::cout << "the maximum value in a char = " << static_cast<std::size_t>(std::numeric_limits<char>::max()) << "\n";

    std::cout << "the minimum value in an unsigned char = " << static_cast<std::size_t>(std::numeric_limits<unsigned char>::min()) << "\n";
    std::cout << "the maximum value in an unsigned char = " << static_cast<std::size_t>(std::numeric_limits<unsigned char>::max()) << "\n";

    return 0;
}

因此,您可以选择使用小于129的数字或更改为unsigned char. or std::uint8_t

bvjveswy

bvjveswy3#

该类型为signed类型。signed“char”的范围从-128到127。当您将129分配给它时,它比最大容量高两个(129-127)数字。因此,在达到最大容量后,它开始从最小容量计数,并观察到-127打印。
要查看129,请使用unsigned char,其范围为0到255。

相关问题