Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++字符运算溢出_C++ - Fatal编程技术网

C++字符运算溢出

C++字符运算溢出,c++,C++,如果127>x>-127,上述代码将生成正常的int值 如果为其他值,则为溢出值。我不明白溢出值是如何计算的。在这种情况下为-80。 谢谢,Char只有一个字节。在这种情况下,1200是0100 1011 0000二进制。 对于一个字节,您只能分配8位,在您的情况下:10110000前4位将被删除。现在有-80第一位显示负1或正0。 试试你的计算器程序员,输入1200十进制,从Qword切换到字节,你可以看到你的数字发生了什么 字符只有一个字节。在这种情况下,1200是0100 1011 000

如果127>x>-127,上述代码将生成正常的int值 如果为其他值,则为溢出值。我不明白溢出值是如何计算的。在这种情况下为-80。
谢谢,Char只有一个字节。在这种情况下,1200是0100 1011 0000二进制。 对于一个字节,您只能分配8位,在您的情况下:10110000前4位将被删除。现在有-80第一位显示负1或正0。
试试你的计算器程序员,输入1200十进制,从Qword切换到字节,你可以看到你的数字发生了什么

字符只有一个字节。在这种情况下,1200是0100 1011 0000二进制。 对于一个字节,您只能分配8位,在您的情况下:10110000前4位将被删除。现在有-80第一位显示负1或正0。
试试你的计算器程序员,输入1200十进制,从Qword切换到字节,你可以看到你的数字发生了什么

这里的诀窍是如何表示数字。调查二进制中的30*40是1200或10010110000基数2。但是我们的字符只有8位,所以我们去掉了前100位和之前所有隐含的0。这给我们留下了1011000个

注意前面的1。在计算机存储值的方式中,这表示负数。11111111是-1,11111110是-2,依此类推。如果下降到1011000,我们得到-80

也就是说,如果我们把1011000转换成2s补码,剩下的是-80


你可以手工做。取该值,删除前导符号位并交换其他值。在这种情况下,10110000在二进制中变成01001111,这将是79。把它变成负数,再去掉一个,因为我们不是从零开始,而是在-80。

这里的诀窍是数字是如何表示的。调查二进制中的30*40是1200或10010110000基数2。但是我们的字符只有8位,所以我们去掉了前100位和之前所有隐含的0。这给我们留下了1011000个

注意前面的1。在计算机存储值的方式中,这表示负数。11111111是-1,11111110是-2,依此类推。如果下降到1011000,我们得到-80

也就是说,如果我们把1011000转换成2s补码,剩下的是-80


你可以手工做。取该值,删除前导符号位并交换其他值。在这种情况下,10110000在二进制中变成01001111,这将是79。把它变成负数,再去掉一个,因为我们不是从零开始,而是在-80。

符号类型溢出是未定义的行为,所以结果可能是什么,包括一条鲸鱼掉在你的房子上。30*40=1200溢出…@SamiKuhmonen很奇怪,这碗牵牛花落下时,脑海中唯一闪过的是哦,不,不再是了。不,它不会编译。实现应将字符定义为与有符号字符或无符号字符具有相同的范围、表示和行为。[…]无论做出何种选择,char都是与其他两种类型不同的一种类型,并且与任何一种都不兼容。-ISO/IEC 9899:2011,编程语言-C。永远不要在算术中使用字符。如果您必须使用sizeof T==1的类型,请显式地使用有符号字符或无符号字符。有符号类型溢出是未定义的行为,因此结果可能是什么,包括一条鲸鱼掉在您的房子上。30*40=1200有溢出…@SamiKuhmonen很奇怪,这碗牵牛花落下时,脑海中唯一闪过的是哦,不,不再是了。不,它不会编译。实现应将字符定义为与有符号字符或无符号字符具有相同的范围、表示和行为。[…]无论做出何种选择,char都是与其他两种类型不同的一种类型,并且与任何一种都不兼容。-ISO/IEC 9899:2011,编程语言-C。永远不要在算术中使用字符。如果必须使用sizeof T==1的类型,请显式使用有符号字符或无符号字符。我们如何知道必须切掉前导100和所有隐含的0?当值可以由较小的类型表示时,是否将有符号int转换为较小的类型UB?@NikhilVerma我们不知道。这就是这里实际发生的事情,但也可能发生其他事情。它是UB。一个字符通常是8位。所以我们把剩下的8位都切掉了。sizeofchar将提供类型占用的字节数。很可能是1。正如上面提到的,有上有下,没有定义,但上面可能是实际发生的事情。我们怎么知道我们必须切掉前导的100和之前所有隐含的0?当值可以用较小的类型表示时,有符号int不是转换成较小的类型UB吗?@NikhilVerma我们不知道。这就是这里实际发生的事情,但也可能发生其他事情。它是UB。一个字符通常是8位。所以我们把剩下的8位都切掉了。sizeofchar将提供类型占用的字节数。很可能是1。如上所述,上下溢 而且没有定义,但上面可能就是实际发生的情况
#include <stdio.h>

int main()
{
    char a = 30;
    char b = 40;
    char c = 10;
    printf ("%d ", char(a*b));
    char d = (a * b) / c;
    printf ("%d ", d);
    return 0;
}