C++ C++;:类似的mod操作打印不同的值

C++ C++;:类似的mod操作打印不同的值,c++,mod,C++,Mod,我试图执行一些自定义操作,但我注意到以下错误。 在计算t的值时,我得到了所需的输出,但是对于s我得到了负值,这是没有原因的 #include <bits/stdc++.h> using namespace std; int main() { char s = 'r'; char temp1 = s; char t = 'a'; char temp2 = t; s = (int(temp1) % int(96)) + (int(s) %

我试图执行一些自定义操作,但我注意到以下错误。 在计算
t
的值时,我得到了所需的输出,但是对于
s
我得到了负值,这是没有原因的

#include <bits/stdc++.h>

using namespace std;

int main()
{
    char s = 'r';
    char temp1 = s;

    char t = 'a';
    char temp2 = t;

    s = (int(temp1) % int(96)) + (int(s) % int(96)) + 96;
    cout << int(s) << " ";

    t = (int(temp2) % int(96)) + (int(t) % int(96)) + 96;
    cout << int(t) << endl;
}
#包括
使用名称空间std;
int main()
{
字符s='r';
char temp1=s;
chart='a';
char temp2=t;
s=(int(temp1)%int(96))+(int(s)%int(96))+96;

cout您遇到了8位整数类型(char)的溢出问题

这个表达式是

s = (int(temp1) % int(96)) + (int(s) % int(96)) + 96;
从代数角度讲,您的代码简化为:

s = 114 % 96 + 114 % 96 + 96;

s = 18 + 18 + 96;

s = (signed char)132;  // overflow!  132 won't fit in range [-128..127]

s = -124;
将s和t的声明更改为int类型。还提供了一些改进代码样式的有用方法:

int main()
{
    int s = 'r';
    int temp1 = s;

    int t = 'a';
    int temp2 = t;

    s = temp1 % 96 + s % 96 + 96;
    cout << s << " ";

    t = temp2 % 96 + t % 96 + 96;
    cout << t << endl;
}
intmain()
{
int s='r';
int temp1=s;
int t='a';
int temp2=t;
s=temp1%96+s%96+96;

密码样式:不要说
int(96)<代码> >代码> > 96 < /代码>我不明白为什么124开始打印-你希望它打印什么?不管你的答案是什么,然后考虑什么是<代码> char < /代码>,因为这是你想要存储结果的变量。你可能想使用<代码>无符号char < /c> > SudhanvaNarayana @ OK,那么范围是什么?一个
有符号的字符
?@SudhanvaNarayana这就是你的答案。看看这有多简单?132不在-128到127的范围内。如果我们说的是2的补码,它的位模式实际上会产生-124。如果这个字符是一个字符串呢?(假设我在字符串的[I]中循环)您可以在打印前将值强制转换回
char
。例如,
cout它是超出范围的赋值,而不是溢出。(溢出是指算术运算的结果超出从操作数推断的结果类型的范围;但赋值不是算术运算)。对于有符号整数类型,溢出通常是未定义的,而超出范围的赋值是由实现定义的。