博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一段代码的疑问(1)——unsigned与signed
阅读量:6713 次
发布时间:2019-06-25

本文共 3772 字,大约阅读时间需要 12 分钟。

现象:

先来看一段代码:

这段代码的输出结果是:

-84

4294967264

分析:

xiaoqiang@dev:~/cpp$ g++ -g c212.cc -o tempxiaoqiang@dev:~/cpp$ lsc143.cc  c144.cc  c212.cc  temp
可以看到多出一个temp文件
xiaoqiang@dev:~/cpp$ gdb tempGNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04Copyright (C) 2012 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-linux-gnu".For bug reporting instructions, please see:
...Reading symbols from /home/xiaoqiang/cpp/temp...done.(gdb) list1 #include
2
(gdb) b 6Breakpoint 1 at 0x4007ea: file c212.cc, line 6.
3 int main(){4 unsigned u = 10;5 int i = -42;6 std::cout << i + i << std::endl;7 std::cout << u + i << std::endl;8 return 0;9 }(gdb) 进入到gdb调试模式我们来看个究竟
(gdb) b 6Breakpoint 1 at 0x4007ea: file c212.cc, line 6.
开始运行,就会发现程序停在了第6行
(gdb) rStarting program: /home/xiaoqiang/cpp/temp warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000Breakpoint 1, main () at c212.cc:66               std::cout << i + i << std::endl;(gdb)
我们来看看i的二进制值是多少
(gdb) print /t i$1 = 11111111111111111111111111010110
在使用unsigned int 和 int类型变量运算的时候,首先会将int类型转换成(看成)unsigned int类型,上面两个值在内存中相加为:
11111111  11111111  11111111  01100000
十六进制为 FFFFFFE0
十进制为4294967264

练习:

看一下下面代码猜一下最终输出结果:
xiaoqiang@dev:~/cpp$ gdb tempGNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04Copyright (C) 2012 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-linux-gnu".For bug reporting instructions, please see:
...Reading symbols from /home/xiaoqiang/cpp/temp...done.(gdb) list1 #include
23 int main(){4 unsigned u1 = 42, u2 = 10;5 std::cout << u1 - u2 << std::endl;6 std::cout << u2 - u1 << std::endl;7 return 0;8 }(gdb)
看一下u1和u2的二进制表示
Breakpoint 1, main () at c213.cc:55               std::cout << u1 - u2 << std::endl;(gdb) next326               std::cout << u2 - u1 << std::endl;(gdb) next42949672647               return 0;(gdb) print /t u2$2 = 1010(gdb) print /t u1$3 = 101010(gdb)
差值为11111111  111111111  11111111  11100000
如果以unsigned int 类型显示则是 4294967264,如果以int类型显示(有符号)则为-32.

相关知识:

1、什么是GDB
GDB是
开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做
,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
2、GDB的基本命令
编译时必须加上参数-g ,例:g++ -g temp.cpp -o temp.通过Gcc编译生成可执行文件才能用Gdb进行调试。进入gdb界面:gdb temp. 提示符变成(gdb)
(1)查看文件
在Gdb中键入”l”(list)就可以查看所载入的文件
(2)设置断点
只需在”b”后加入对应的行号即可(这是最常用的方式,另外还有其他方式设置断点)。如下所示:
(gdb)b 6
代码运行到第五行之前暂停(并没有运行第五行)。
(3)查看断点情况
(Gdb) info b
(4)运行代码
Gdb默认从首行开始运行代码,可键入”r”(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。
(5)查看变量值
查看断点处的相关变量值。在Gdb中只需键入”p”+变量值即可,如下所示:
(Gdb) p n
Gdb在显示变量值时都会在对应值之前加上”$N”标记,它是当前变量值的引用标记,所以以后若想再次引用此变量就可以直接写作”$N”,而无需写冗长的变量名。
(6)单步运行
使用命令”n”(next)或”s”(step),它们之间的区别在于:若有函数调用的时候,”s”会进入该函数而”n”不会进入该函数。因此,”s”就类似于VC等工具中的”step in”,”n”类似与VC等工具中的”step over”。
(7)恢复程序运行
使用命令”c”(continue).
在Gdb中,程序的运行状态有“运行”、“暂停”和“停止”三种,其中“暂停”状态为程序遇到了断点或观察点之类的,程序暂时停止运行,而此时函数的地址、函数参数、函数内的局部变量都会被压入“栈”(Stack)中。故在这种状态下可以查看函数的变量值等各种属性。但在函数处于“停止”状态之后,“栈”就会自动撤销,它也就无法查看各种信息了。
(8)查看数据
print  variable        查看变量
print         查看数组(array是数组指针,len是需要数据长度)
可以通过添加参数来设置输出格式:
/x 按十六进制格式显示变量。
 /d 按十进制格式显示变量。
/u 按十六进制格式显示无符号整型。
/o 按八进制格式显示变量。
/t 按二进制格式显示变量。 
/a 按十六进制格式显示变量。
/c 按字符格式显示变量。
/f 按浮点数格式显示变量。

转载于:https://www.cnblogs.com/lanzhi/p/6468840.html

你可能感兴趣的文章
Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的
查看>>
再议Swift操作符重载
查看>>
pc机进入android的shell
查看>>
javascript Date format(js日期格式化)
查看>>
Loadrunner中参数化实战(6)-Random+Each occurrence
查看>>
tomcatserver解析(六)-- Acceptor
查看>>
asp.net判断访问者是否来自移动端
查看>>
Python 一些常用模块的安装
查看>>
严苛模式(StrictMode)
查看>>
牛客网-《剑指offer》-跳台阶
查看>>
unity, editorWindow update计时
查看>>
我的VSTO之路(二):VSTO程序基本知识
查看>>
DataTable.Compute 性能慢的问题
查看>>
分层是一种思想
查看>>
Prime Ring Problem
查看>>
Windows系统bug
查看>>
Chrome应用技巧之代码整理。
查看>>
Linux下配置Hadoop 1.2.1
查看>>
Fluentd 例子
查看>>
解决上传服务器端文字乱码
查看>>