我试过执行以下程序:
#include <stdio.h>
int main() {
signed char a = -5;
unsigned char b = -5;
int c = -5;
unsigned int d = -5;
if (a == b)
printf("\r\n char is SAME!!!");
else
printf("\r\n char is DIFF!!!");
if (c == d)
printf("\r\n int is SAME!!!");
else
printf("\r\n int is DIFF!!!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于这个程序,我得到输出:
char是DIFF !!! int是相同的!
为什么我们两者都有不同的输出?
输出应该如下?
char是相同的!int是相同的!
一个键盘连接.
我找到了一些关于这个问题的线索.大多数人似乎倾向于在他们的c#代码中使用int,即使一个字节或一个smallint处理数据,除非它是一个移动应用程序.我不明白为什么.将C#数据类型定义为数据存储解决方案中的相同数据类型是否更有意义?
我的前提:如果我使用的是类型化的数据集,Linq2SQL类,POCO,无论如何我都会遇到编译器数据类型转换问题,如果我不保持我的数据类型在我的层之间保持同步.我真的不喜欢一直在做System.Convert,因为在c#代码中使用int更容易.我总是使用任何最小的数据类型来处理数据库和代码中的数据,以保持我的数据库接口干净.所以我敢打赌,75%的C#代码使用byte或short而不是int,因为这就是数据库中的内容.
可能性:这是否意味着大多数只为代码中的所有东西使用int的人也使用int数据类型作为他们的sql存储数据类型,并且可能不太关心他们的数据库的整体大小,或者他们是否在适当的情况下在代码中执行system.convert?
为什么我关心:我一直在努力工作,我只想熟悉最佳实践和标准编码惯例.
在常规int中使用mysql表中的smallint数据类型是否实际上提高了内存使用量?难道硬件不会为所有数据分配完整的64位字大小吗?如果它没有分配一个完整的单词,那么我们不会因为必须从内存中分配的64位字中解析出多个smallint或tinyints而导致性能下降吗?
基本上,假设我们知道Status列中存储的值的范围永远不会超过smallint的最大/最小范围,那么使用下表后面的表是否有任何设计/内存/性能优势?任何见解将不胜感激:
create table `TestTableWithSmallInt` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`Status` smallint(11) DEFAULT 0,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create table `TestTableWithInt` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`Status` int(11) DEFAULT 0,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud) 我正在学习 Rust,在官方教程中,作者将值 5 赋给了一个变量,如下所示:
let x: i32 = 5;
我认为这很奇怪,因为可以用作u8类型并且程序可以正常运行。这让我思考,使用较低的位数有什么优势吗?更快吗?