Solidity中signed/unsigned integer定义疑问:无符号整数能否存负数?
Solidity无符号整数能否存储负数?
你看到的这段Packt书籍内容是错误的,Solidity中的无符号整数(uint系列类型,如uint256)完全不能存储负数,原因如下:
Solidity整数类型的明确定义
- 有符号整数(
int系列,如int256):采用补码编码,可表示范围为-2^(n-1)到2^(n-1)-1,确实支持正负值存储。 - 无符号整数(
uint系列):仅能表示非负整数,范围是0到2^n -1,没有任何机制可以存储负数。
- 有符号整数(
关于“溢出导致负数”的误区
早期Solidity(0.8.0版本之前)未默认启用溢出检查,若对无符号整数执行下溢操作(如uint256(0) - 1),数值会绕回到2^256 - 1——这是一个极大的正数,并非负数。只是该值的二进制补码形式与有符号整数的-1一致,但无符号类型不会将其解析为负数。
0.8.0及以上版本中,这类溢出操作会直接触发交易回滚,不会产生任何异常数值。代码验证
尝试直接给无符号整数赋值负数,编译阶段就会报错:// 编译报错:TypeError: Type int_const -1 is not implicitly convertible to expected type uint256. uint256 num = -1;
总结:书籍中关于无符号整数可存储负数的描述是笔误或概念错误,Solidity的无符号整数只能存储0和正数。
内容的提问来源于stack exchange,提问作者mario7111
相关产品推荐
相关产品推荐

