有符号数、无符号树混合计算问题。

今天在线刷题,其中一个问题总是结果跟期望的不一样,在一次次的检查程序逻辑、确认无误后,还是不能通过,不得已用VS开始调试!

这里是我的程序代码:

 1 // maxDepth.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include<vector>
 6 #include<iostream>
 7 #include<limits.h>
 8
 9 using namespace std;
10
11 class TreeNode {
12 public:
13      int val;
14      TreeNode *left, *right;
15      TreeNode(int val) {
16          this->val = val;
17          this->left = this->right = NULL;
18      }
19  };
20
21 class Solution {
22 public:
23     /**
24      * @param root: The root of binary tree.
25      * @return: An integer
26      */
27     void PreOrder(TreeNode *root, std::vector<TreeNode*> &path)
28     {
29         if (!root)
30             return;
31         path.push_back(root);
32         if(!root->left && !root->right)
33             if (path.size() > max)
34                 max = path.size();
35         if(root->left) PreOrder(root->left, path);
36         if(root->right) PreOrder(root->right, path);
37         path.pop_back();
38     }
39     int maxDepth(TreeNode *root) {
40         // write your code here
41         if (!root)
42             return 0;
43         std::vector<TreeNode*> path;
44         PreOrder(root, path);
45         return max;
46     }
47     Solution():max(INT_MIN){;}
48 private:
49     int max;
50 };
51
52 void Test()
53 {
54     int c = -1;
55     if (c > (unsigned)1)std::cout << "c > -1" << std::endl;
56     c = INT_MIN;
57     //std::cout << c;
58     //std::cout <<
59
60     std::cout << -7 + (unsigned)5 << std::endl;
61     std::cout << -7 + (unsigned)10 << std::endl;
62
63     //bool b = c > 1;
64     //std::cout << b ;
65
66 }
67
68 int _tmain(int argc, _TCHAR* argv[])
69 {
70     TreeNode *root = new TreeNode(0);
71     Solution so;
72     std::cout << so.maxDepth(root) << std::endl;
73
74     Test();
75
76
77
78     return 0;
79 }

调试时发现,33行处if (path.size() > max)怎么都不会执行。如此就明白了,这里涉及到有符号、无符号数的混合运算问题!

1. int max定义的是有符号数,并且初始化为最小的负数INT_MIN,而size()函数返回的是无符号数,在混合运算中,会把有符号数转化为无符号数。负数的第一位为1,转化为无符号数之后大于所有的正数,所以这里怎么都不会执行!

2. 转化过程后运算时,可能会发生溢出,C的简单做法就是截断!如我这里的test()函数的编译信息。

3. 实际上,我在编译时,VS已经对33行发出警告“ warning C4018: “>”: 有符号/无符号不匹配”,可是我却忽视了这个做法。所以,绝不要忽视编译器的任何警告。

4.实际上,在CSAPP第二章中,就对有符号、无符号数进行了深入的讨论。并且得出了“无符号数的带来的弊端远大于它所带来的作用,尽量少使用无符号数”的结论。可是C++标准库中,很多关于size(),capacity()函数返回的都是无符号数,所以处理这样的程序中,必须小心处理有符号无符号数混合运算的问题!

时间: 2024-12-25 19:08:09

有符号数、无符号树混合计算问题。的相关文章

有符号数,符号位扩展

char readbuf[64]; int data_size = (readbuf[7]<<24)|(readbuf[4]<<16)|(readbuf[5]<<8)| readbuf[6]; int data_size = (readbuf[7]<<24)+(readbuf[4]<<16)+(readbuf[5]<<8)+readbuf[6]; readbuf :  09 00 3c 16 00 00 96 00 00 00 00

【c语言】有符号数据类型与无符号数据类型的计算

// 有符号数据类型与无符号数据类型的计算 #include <stdio.h> int main() { char c;// -128~127 unsigned char uc;//0~255 unsigned short us;// 0~65535 c = 128; uc = 128; // 字符型给短整型赋值有默认的类型提升,前边八位补其符号位 us = c + uc; // us = -128 + 128 = 0即1111 1111 1000 0000 + 0000 0000 1000

关于无符号整型数中1的个数与0的个数的改变与计算引发的思考

首先可以把unsigned int数中的1的个数与0的个数改变与计算的实现: </pre><pre name="code" class="cpp">/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 *

java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

public class txs { static void leftbit(){ int i;               //整型长度为32位                                                                                          //位 int num=0xFFFFFFE;  //1111 1111 1111 1111 1111 1111 1110      //28 for(i=0;i<28;i++

java移位运算符实验程序:&amp;lt;&amp;lt;(左移)、&amp;gt;&amp;gt;(带符 号右移)和&amp;gt;&amp;gt;&amp;gt;(无符号右移)

public class txs { static void leftbit(){ int i;               //整型长度为32位                                                                                          //位 int num=0xFFFFFFE;  //1111 1111 1111 1111 1111 1111 1110      //28 for(i=0;i<28;i++

Java-java中的有符号,无符号操作以及DataInputStream

1. 无符号和有符号 计算机中用补码表示负数,并且有一定的计算方式:另外,用二进制的最高位表示符号,0表示正数.1表示负数.这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字符类型的-1二进制表示是“1111 1111”16进制表示为FF,而不是1000 0001. 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 一个字节为8位,按0开始记,那它的最高位就是第7位,2个字节,最高位就是15位,4个字节,最高位

位向量 补码与无符号 加法与乘法 CSAPP学习笔记

计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数. 无符号数编码: 补码编码: 由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295(这里指的是32位数) . 在整数运算之前必须先了解 整数的扩展和截断 扩展分为零扩展和符号扩展,零扩展是简单的在表示的开头添加0,适用于无符号数的扩展.而符号扩展在表示中添加最高有效位值的副本,适用于补码的扩展.比如4位的1

C语言的有符号与无符号,二进制整数的扩展与截断

前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看以下C语言的有符号和无符号数. C语言中的有符号数和无符号数 有符号数和无符号数的本质区别其实就是采用的编码不同,前者采用补码编码,后者采用无符号编码. 在C语言中,有符号数和无符号数是可以隐式转换的,不需要手动实施强制类型转换.不过也正是因为如此,可能你一不小心就将一个无符号数赋给了有符号数.就会造成出乎意料的结果,就像下面这样: #include <stdio.h

整数表示 补码与无符号 加法与乘法 CSAPP学习笔记

计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数. 无符号数编码: 补码编码: 由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295 . 在整数运算之前必须先了解 整数的扩展和截断 扩展分为零扩展和符号扩展,零扩展是简单的在表示的开头添加0,适用于无符号数的扩展.而符号扩展在表示中添加最高有效位值的副本,适用于补码的扩展.比如4位的1101扩展成8位,即1