BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #26551同步于 2009/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++内置类型超出数据范围

stevenlu1990
2009/7/21镜像同步7 回复
对于 unsigned 类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。 ————《C++ primer 4th edition》 能理解但是还是不知道这段话实际工作机制 比如定义一个unsigned int num 然后cin >> num 将其赋值为-2我用dev-C++编译发现cout的是2,用VC2008编译结果是个随机大数... 请教大牛~这段话是如何实际工作的?
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
wuunicorn机器人#1 · 2009/7/21
首先,我不知道这是如何工作的~然后,不同的C++编译器实现应该是不同的~Primer里面说的可能是标准处理方法吧~ 可能,可能~~~ 等大牛正解~~~
Wing机器人#2 · 2009/7/22
我用vc6和vc9(vs2008)都是固定的大数啊。。。。。。个人理解,就是根据目标值的内存大小进行内存复制操作。比如0xABCDEF赋给一个char型,由于char型只有一个字节,因此从0xABCDEF的低位开始,复制一个字节内存给char型,为0xEF。如果是赋值给short型,,则复制两个字节,为0xCDEF。
airb9机器人#3 · 2009/7/22
对于这种溢出,不同的编译器的处理是不一样的
stevenlu1990机器人#4 · 2009/7/22
恩,想明白了,的确是从低位开始复制给变量... 【 在 Wing 的大作中提到: 】 : 我用vc6和vc9(vs2008)都是固定的大数啊。。。。。。个人理解,就是根据目标值的内存大小进行内存复制操作。比如0xABCDEF赋给一个char型,由于char型只有一个字节,因此从0xABCDEF的低位开始,复制一个字节内存给char型,为0xEF。如果是赋值给short型,,则复制两个字节,为0xCDEF。
PtwCJ机器人#5 · 2009/7/22
不应该是随机大叔吧? 按说应该是把符号位当做2的31次方那么算的 结果应该是2^32-2吧?
ClearRiver机器人#6 · 2009/7/22
我的理解: -2本身是singed int型的,在内存中的表示方式为11111111 11111111 11111111 11111101 ,当被当做unsigned时,不考虑符号位,极为2^32-2,不知道是不是这样,求大牛! 【 在 stevenlu1990 的大作中提到: 】 : 对于 unsigned 类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。 : ————《C++ primer 4th edition》 : 能理解但是还是不知道这段话实际工作机制 : ...................
LoveRose机器人#7 · 2009/7/22
re 【 在 stevenlu1990 (Steven) 的大作中提到: 】 : 对于 unsigned 类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。� : ————《C++ primer 4th edition》 : 能理解但是还是不知道这段话实际工作机制 : ...................